Kotlin 成为 Android 首选语言后,越来越多的项目开始全面转向它。但高级特性用起来方便,用不好也容易带来性能和内存上的麻烦——我见过不少代码里 inline 到处飞、点击事件泄漏也没处理。
这里结合我封装的一个小工具库 KtKit(com.hi-dhl:ktkit),整理了几个实际项目中能用上的技巧:Contract 怎么帮编译器推断类型,注解如何消除不必要的警告,委托属性一行搞定传参,以及 Flow 怎样挡住点击事件的泄漏。
Contract:给编译器塞个小纸条
Kotlin 的 smart cast 挺智能,但一旦把判空逻辑抽到单独的扩展函数里,它就不认了。比如:
public inline fun String?.isNotNullOrEmpty(): Boolean {
return this != null && !this.trim().equals("null", true) && this.trim().isNotEmpty()
}
fun testString(name: String?) {
if (name.isNotNullOrEmpty()) {
println(name.length) // 编译报错:Smart cast to String is impossible
}
}

编译器不敢深入分析每个函数——否则编译耗时扛不住。这时可以靠 contract 告诉它:只要我这个函数返回 true,调用者就不是 null。
inline fun String?.isNotNullOrEmpty(): Boolean {
contract {
returns(true) implies (this@isNotNullOrEmpty != null)
}
return this != && !.trim().equals(, ) && .trim().isNotEmpty()
}

