隨着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