面向 Java 程序员的 Kotlin

最后更新: 2023-06-24 05:18:44 +0800 +0800
tags: Kotlin | Java | Jvm
原文以英文撰写。您正在阅读AI翻译版本。

Kotlin 会编译为 JVM 字节码,并可直接与 Java 互操作,同时还提供 空安全、简洁声明、扩展函数和结构化并发。

类与构造函数 #

一个类在其头部有一个主构造函数,在类体中还可以有次构造函数。 只有用 val 或 var 标记时,主构造函数的参数才会成为属性; 初始化代码应放在 init 块中。

kotlin
class Account(val id: String, initialBalance: Int) {
    var balance = initialBalance
        private set

    init {
        require(initialBalance >= 0)
    }

    constructor(id: String) : this(id, 0)
}

次构造函数必须直接委托给主构造函数,或通过另一个次构造函数间接委托。 如果使用主构造函数和默认参数能够清晰表达 API,应优先采用这种方式。

扩展与可空性 #

扩展函数在调用处看起来像实例方法,但它是静态解析的; 它无法真正覆盖成员方法。

kotlin
fun String.initials(): String =
    trim().split(Regex("\\s+")).joinToString("") { it.take(1) }

Kotlin 区分 String 和可空的 String?。应使用安全调用(?.)、 Elvis 运算符(?:)和显式检查,而不要依赖 Java 风格的 可空性假设。除非失败确实符合所需契约,否则应避免使用 !!。

协程 #

suspend fun 表示一个可能挂起但不会阻塞其线程的函数。 底层 kotlin.coroutines 包定义了 CoroutineContext 和 Continuation 等原语;kotlinx.coroutines 库提供实用 API, 并且必须单独添加。

kotlin
class UserService(private val api: UserApi) {
    suspend fun load(id: String): User = api.fetch(id)
}

应从结构化的 CoroutineScope 启动工作,而不是使用 GlobalScope。 Job 表示可取消的工作,CoroutineDispatcher 用于选择执行线程; 常用调度器包括 Dispatchers.Default 和 Dispatchers.IO。 取消采用协作机制,因此挂起调用和循环不应吞掉 CancellationException。

CoroutineExceptionHandler 应用于报告根协程中未捕获的异常, 而不是作为常规错误处理机制。子协程失败和取消遵循结构化并发规则, 因此生命周期会得到明确表达。

评论

在 GitHub 上阅读或评论(发表评论需要登录)