Kotlin新手入门:5个致命错误及如何避免

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么Kotlin看似简单,却暗藏陷阱

\n\n

Kotlin是一种现代、简洁且极其便利的语言。许多新手从Java或Python转过来,心想:“这语言看起来很简单嘛!”确实,Kotlin的语法干净整洁,可空类型能防止空指针异常,而像let、apply和run这样的函数式特性看起来也神奇地简单。但正是这种表面的简单性,常常成为陷阱。

\n\n

在本文中,我们将剖析新手在学习Kotlin时最常见的错误。您将了解如何避免这些错误,并获得现成的代码示例。如果您刚刚开始学习Kotlin,本文能帮您节省大量调试时间。

\n\n

错误一:忽视空安全,或者走向另一个极端——过度焦虑

\n\n

Kotlin将空安全直接内置于类型系统中。这是好事,但新手常常走向两个极端。第一个极端是完全忽视空安全,到处使用!!(非空断言)运算符。第二个极端是过度使用Elvis运算符?:和?.let链,导致代码变得难以阅读。

\n\n

错误示例

\n\n
// 糟糕:滥用 !! —— 破坏了Kotlin的所有安全性
fun processUser(user: User?) {
    val name = user!!.name  // 如果 user == null —— 崩溃!
    println(name.uppercase())
}

// 糟糕:过多的嵌套 let
fun getUserCity(user: User?): String? {
    return user?.let {
        it.address?.let { addr ->
            addr.city?.let { city ->
                city.name
            }
        }
    }
}
\n\n

正确做法

\n\n
// 良好:使用安全调用 + Elvis
fun processUserSafe(user: User?) {
    val name = user?.name ?: "访客"
    println(name.uppercase())
}

// 优秀:使用扩展和范围函数,避免嵌套混乱
fun getUserCityClean(user: User?): String? {
    return user?.address?.city?.name
}
\n\n

建议:仅在您100%确定值不为null时使用!!运算符(例如在if检查之后)。其他情况请使用?.和?:。

\n\n

这是Kotlin新手的主要问题之一——他们要么害怕null,要么不知道如何处理它。请记住:Kotlin并不禁止null,它只是迫使您考虑null的情况。

\n\n

错误二:不理解var、val和常量之间的区别

\n\n

看起来val就像Java中的final变量。但并非如此。val是只读引用,而不是不可变对象。新手常常将val与编译时常量(const val)混淆,并惊讶于代码为何不如预期工作。

\n\n

混淆示例

\n\n
// 新手认为:"val = 不可变"
val list = mutableListOf(1, 2, 3)
list.add(4)  // 可以工作!但新手很震惊

// 而这是编译错误
val name = "Alice"
name = "Bob"  // 错误:val不能被重新赋值
\n\n

如何区分

\n\n
// 编译时常量 —— 仅适用于基本类型和String
const val PI = 3.14159

// 只读引用 —— 可在运行时计算
val currentTime = System.currentTimeMillis()

// 真正的不可变性 —— 使用不可变集合
val immutableList = listOf(1, 2, 3)  // 使用listOf,而不是mutableListOf
\n\n

黄金法则:尽可能使用val。只有当变量需要改变时才使用var。而const val仅用于顶层常量或object/companion object内部。

\n\n

错误三:滥用companion object和object单例

\n\n

Kotlin通过ob

博客

书籍推荐