Kotlin 初学者最常犯的错误:从 A 到 Z
Kotlin 是一种现代、简洁且安全的语言,迅速赢得了 Android 开发者和后端工程师的青睐。然而,即使是在这样友好的语言中,初学者也常常会犯一些典型错误,这些错误会拖慢学习进度并导致 bug。在本文中,我们将剖析最常见的问题——从误解空安全到过度使用 lateinit。你将学会如何避免这些错误,并编写出简洁高效的 Kotlin 代码。
1. 忽视空安全以及对可空类型的不正确处理
Kotlin 的主要特性之一是其内置的 NullPointerException 防护机制。但初学者经常尝试使用类似 Java 的方法,从而导致错误。
错误:在没必要的情况下使用 !!(非空断言)
很多人会写:
fun getUserName(user: User?): String { return user!!.name // 如果 user == null — 将会得到 NPE}最好使用安全调用(?.)或 Elvis 运算符(?:):
fun getUserName(user: User?): String { return user?.name ?: "Guest"}错误:不正确使用 lateinit var
lateinit 字段适用于你确定变量在首次使用前会被初始化的情况(例如在 Android 的 onCreate 中)。但如果你在初始化之前访问 lateinit,会得到 UninitializedPropertyAccessException。
提示:仅对 var 使用 lateinit,并在访问前检查 ::variable.isInitialized 属性。
2. 集合的不正确使用:可变 vs 不可变
Kotlin 明确区分了 List(只读)和 MutableList。初学者经常混淆它们,导致编译错误或意外行为。
错误:尝试修改不可变列表
val list = listOf(1, 2, 3)list.add(4) // 编译错误!listOf 返回的是 List,不是 MutableList如果你需要一个可变集合,请使用 mutableListOf:
val mutableList = mutableListOf(1, 2, 3)mutableList.add(4) // 可以工作错误:从公共 API 返回 MutableList
这会破坏封装性。最好返回 List:
// 不好fun getItems(): MutableList<String> = mutableListOf("a", "b")
// 好fun getItems(): List<String> = mutableListOf("a", "b").toList()3. 过度使用 companion object 而非顶层函数
Kotlin 没有静态方法,但有 companion object。初学者常常把所有东西都放进去,即使可以使用更简洁的顶层函数或属性。
错误示例:
class Utils { companion object { fun formatDate(date: Date): String { ... } }}
// 调用: Utils.formatDate(...)最好将函数移到文件级别:
// 文件: DateUtils.ktfun formatDate(date: Date): String { ... }
// 调用: formatDate(...)这使代码更简洁,并且无需创建额外的类。仅在需要工厂方法或与类相关的常量时使用 companion object。
4. 误解密封类与 when 表达式
密封类是表示受限类层次结构的强大工具。然而,初学者经常忘记 else 分支,或者使用 if-else 代替 when,从而失去了所有优势。
错误:在密封类的 when 中使用 else
sealed class Result { data class Success(val data: String) : Result() data