Kotlin 会编译为 JVM 字节码,并可直接与 Java 互操作,同时还提供 空安全、简洁声明、扩展函数和结构化并发。
类与构造函数 #
一个类在其头部有一个主构造函数,在类体中还可以有次构造函数。
只有用 val 或 var 标记时,主构造函数的参数才会成为属性;
初始化代码应放在 init 块中。
class Account(val id: String, initialBalance: Int) {
var balance = initialBalance
private set
init {
require(initialBalance >= 0)
}
constructor(id: String) : this(id, 0)
}次构造函数必须直接委托给主构造函数,或通过另一个次构造函数间接委托。 如果使用主构造函数和默认参数能够清晰表达 API,应优先采用这种方式。
扩展与可空性 #
扩展函数在调用处看起来像实例方法,但它是静态解析的; 它无法真正覆盖成员方法。
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,
并且必须单独添加。
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 上阅读或评论(发表评论需要登录)