随着kotlin在个人代码中占比愈来愈大,我以为本身有必要在一段时间的使用以后总结有哪些好的用法和哪些坏的用法。这篇文章记录了我的习惯了的几个kotlin写法,若是以为个人这几种用法不管是性能上或是可读性、可维护性上有问题,欢迎和我一块儿讨论。java
private fun getInfo(jsonObject: JSONObject?): Info? {
return jsonObject?.let {
val uri = it.optString("uri")
val length = it.optString("length")
Info(uri, length)
}
}
复制代码
这样写和用if判空的写法没有区别,实际上根据这段代码编译出的字节码反编译获得的java代码就是if...else...形式的。这样作的好处在于:json
当对象是var可空属性时,即便在判断非空的代码块内也不能把对象当作非空对象,而必须加上!!,致使损失了kotlin提供的空安全。缘由是kotlin考虑到多线程问题,即便在判断非空的代码块内var可空属性仍可能被其余线程设置为null。而局部变量和val可空属性就不须要考虑多线程问题,能够再判断非空的代码块内能够把对象当作非空对象。 使用?.let能够解决这个问题,缘由是let代码块内部使用的it是接收对象的参数,是局部变量。安全
// if...else...写法
private fun testIfElse(): Object? {
return if (a !== null) {
val b = handleA(a)
if (b !== null) {
handleB(b)
} else {
null
}
} else {
null
}
}
// ?.let写法
private fun testLet(): Object? {
return a?.let { handleA(it) }?.let { handleB(it) }
}
复制代码
return TextView(context).apply {
text = "test"
setOnClickListener(onClickListener)
}
复制代码
File(url).takeIf { it.exists() }
?.let {
JSONObject(NetworkUtils.postFile(SERVER_URL, url))
}?.takeIf { it.optString("message") == "success" }
?.let {
post(it.optString("result"))
} ?: mHandler.post { view?.onFail() }
复制代码
这段代码的功能是上传文件、得到数据再上传数据,使用let这种方法能将这几个部分的逻辑彻底分离。多线程
kotlin的语法其实均可以看作java的语法糖,至关于多一层封装,多这一层封装带来性能损失和可读性提升,如何合理使用kotlin的奇妙语法写出让人赏心悦目的代码而又不滥用,这是我之后kotlin开发过程当中将持续探索的问题。app