kotlin代碼中?。〔僮鞣那宄椒?/h1>
更新時(shí)間:2018年06月26日 10:34:07 作者:Knight_Davion
這篇文章主要給大家介紹了關(guān)于kotlin代碼中?。〔僮鞣那宄椒?,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
前言
空安全是Kotlin中非常實(shí)用的特性,它能夠讓你避免許多隱藏的NullPointerExceptions問(wèn)題。然而當(dāng)你使用AS將Java代碼轉(zhuǎn)換成Kotlin代碼后會(huì)出現(xiàn)很多的!! 操作符,因?yàn)槌霈F(xiàn)!!意味著這里可能有未捕獲的KotlinNullPointerException異常。
對(duì)于一個(gè)有強(qiáng)迫癥的程序猿來(lái)說(shuō)一個(gè)類(lèi)中大篇幅的出現(xiàn)!! 絕對(duì)會(huì)使他們發(fā)瘋的。幸運(yùn)的是我們可以通過(guò)以下方式避免使用!!操作符。
1. 使用val代替var
我們都知道val修飾的變量是只讀的,var修飾的變量是可變的,所以我們應(yīng)該盡可能多的使用val,因?yàn)槭褂胿al修飾的變量必須有一個(gè)value,這樣你就不用再擔(dān)心空指針的問(wèn)題,所以如果你能確定一個(gè)變量可以定義成一個(gè)常量,那么請(qǐng)用val修飾它。
2. 使用lateinit
然而你并不能把所有的變量用val修飾,,比如那些需要在Activity的onCreate()中進(jìn)行初始換的變量,針對(duì)這個(gè)情況你可以考慮使用lateinit修飾變量,例如下面的代碼
private var mAdapter: RecyclerAdapter<Transaction>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mAdapter = RecyclerAdapter(R.layout.item_transaction)
}
fun updateTransactions() {
mAdapter!!.notifyDataSetChanged()
}
把mAdapter使用lateinit修飾后代碼變成這樣
private lateinit var mAdapter: RecyclerAdapter<Transaction>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mAdapter = RecyclerAdapter(R.layout.item_transaction)
}
fun updateTransactions() {
mAdapter.notifyDataSetChanged()
}
需要注意的是如果訪問(wèn)一個(gè)還沒(méi)有初始化的變量或?qū)傩詫?huì)導(dǎo)致UninitializedPropertyAccessException異常。
還有一點(diǎn)需要注意的是lateinit并不能修飾基本數(shù)據(jù)類(lèi)型的變量或?qū)傩?,比如Int,Boolean等等,它會(huì)提示你
‘lateinit'modifier is nor allowed on properites of primitive types
此時(shí)你可以使用下面這個(gè)方式
private var mNumber: Int by Delegates.notNull<Int>()
3. 使用let函數(shù)
下面這段代碼的提示我們經(jīng)常會(huì)見(jiàn)到

studio提醒我們mPhotoUrl的value在執(zhí)行uploadPhoto時(shí)可能已經(jīng)改變,不能確定是否非空,通常我們的解決方式是這樣的
private var mPhotoUrl: String? = null
fun uploadClicked() {
if (mPhotoUrl != null) {
uploadPhoto(mPhotoUrl!!)
}
}
然而如果你不想使用!! 這里還有一種更優(yōu)雅的方式
private var mPhotoUrl: String? = null
fun uploadClicked() {
mPhotoUrl?.let { uploadPhoto(it) }
}
只有當(dāng)mPhotoUrl不為空時(shí)let中的代碼才會(huì)執(zhí)行
如果你對(duì)let函數(shù)還不了解,可以看我寫(xiě)的這篇文章
//www.dbjr.com.cn/article/131427.htm
4. 使用特定的函數(shù)處理復(fù)雜的場(chǎng)景
對(duì)于一些簡(jiǎn)單的場(chǎng)景l(fā)et函數(shù)是很好用的,就像上面的情況,但是對(duì)于一些復(fù)雜的場(chǎng)景,比如下面的代碼
if (mUserName != null && mPhotoUrl != null) {
uploadPhoto(mUserName!!, mPhotoUrl!!)
}
當(dāng)然你也可以使用let的方式處理,但是這樣代碼的可讀性就會(huì)降低了,這時(shí)候你可以定義一些特定的函數(shù)來(lái)解決這個(gè)問(wèn)題。
比如下面這個(gè)可以判斷兩個(gè)參數(shù)非空的函數(shù)
fun <T1, T2> ifNotNull(value1: T1?, value2: T2?, bothNotNull: (T1, T2) -> (Unit)) {
if (value1 != null && value2 != null) {
bothNotNull(value1, value2)
}
}
這樣你的代碼就變成了下面這樣
ifNotNull(mUserName, mPhotoUrl) {
userName, photoUrl ->
uploadPhoto(userName, photoUrl)
}
See,!!操作符消失了。
5. 使用Elvis操作符
對(duì)于那些必有返回的情況,Elvis非常的實(shí)用。
Elvis操作符,?:左邊的返回值不為空則返回,否則返回?:右邊的值
fun getUserName(): String {
if (mUserName != null) {
return mUserName!!
} else {
return "Anonymous"
}
}
使用Elvis操作符后
fun getUserName(): String {
return mUserName ?: "Anonymous"
}
通過(guò)上面這幾種辦法基本上你可以清除程序中所有的!!操作符了,而且你的代碼也會(huì)變得更加健壯。如果你還有其他的方式請(qǐng)?jiān)谠u(píng)論區(qū)留言吧。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
-
Android實(shí)現(xiàn)簡(jiǎn)單用戶注冊(cè)案例
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)單用戶注冊(cè)案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2020-05-05
-
Android衛(wèi)星菜單效果的實(shí)現(xiàn)方法
這篇文章主要介紹了Android衛(wèi)星菜單效果的實(shí)現(xiàn)方法,需要的朋友可以參考下 2017-05-05
-
Android開(kāi)發(fā)筆記之探秘WebView
瀏覽器控件是每個(gè)開(kāi)發(fā)環(huán)境都具備的,這為馬甲神功提供了用武之地,windows的有webbrowser,android和ios都有webview。只是其引擎不同,相對(duì)于微軟的webbrowser,android及ios的webview的引擎都是webkit,對(duì)Html5提供支持。本篇主要介紹android的webview。 2014-08-08
-
Flutter應(yīng)用集成極光推送的實(shí)現(xiàn)示例
這篇文章主要介紹了Flutter應(yīng)用集成極光推送的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧 2020-02-02
-
Android實(shí)現(xiàn)從相冊(cè)選擇照片功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)從相冊(cè)選擇照片功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2022-03-03
-
android使用PullToRefresh實(shí)現(xiàn)下拉刷新和上拉加載
本篇文章主要介紹了android使用PullToRefresh實(shí)現(xiàn)下拉刷新和上拉加載,具有一定的參考價(jià)值,有興趣的可以了解一下。
2016-12-12
-
Android 打開(kāi)相冊(cè)選擇單張圖片實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 打開(kāi)相冊(cè)選擇單張圖片實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下 2017-05-05
-
Android高仿2048小游戲?qū)崿F(xiàn)代碼
這篇文章主要介紹了Android高仿2048小游戲?qū)崿F(xiàn)代碼的相關(guān)資料,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下 2016-10-10
最新評(píng)論
前言
空安全是Kotlin中非常實(shí)用的特性,它能夠讓你避免許多隱藏的NullPointerExceptions問(wèn)題。然而當(dāng)你使用AS將Java代碼轉(zhuǎn)換成Kotlin代碼后會(huì)出現(xiàn)很多的!! 操作符,因?yàn)槌霈F(xiàn)!!意味著這里可能有未捕獲的KotlinNullPointerException異常。
對(duì)于一個(gè)有強(qiáng)迫癥的程序猿來(lái)說(shuō)一個(gè)類(lèi)中大篇幅的出現(xiàn)!! 絕對(duì)會(huì)使他們發(fā)瘋的。幸運(yùn)的是我們可以通過(guò)以下方式避免使用!!操作符。
1. 使用val代替var
我們都知道val修飾的變量是只讀的,var修飾的變量是可變的,所以我們應(yīng)該盡可能多的使用val,因?yàn)槭褂胿al修飾的變量必須有一個(gè)value,這樣你就不用再擔(dān)心空指針的問(wèn)題,所以如果你能確定一個(gè)變量可以定義成一個(gè)常量,那么請(qǐng)用val修飾它。
2. 使用lateinit
然而你并不能把所有的變量用val修飾,,比如那些需要在Activity的onCreate()中進(jìn)行初始換的變量,針對(duì)這個(gè)情況你可以考慮使用lateinit修飾變量,例如下面的代碼
private var mAdapter: RecyclerAdapter<Transaction>? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mAdapter = RecyclerAdapter(R.layout.item_transaction) } fun updateTransactions() { mAdapter!!.notifyDataSetChanged() }
把mAdapter使用lateinit修飾后代碼變成這樣
private lateinit var mAdapter: RecyclerAdapter<Transaction> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mAdapter = RecyclerAdapter(R.layout.item_transaction) } fun updateTransactions() { mAdapter.notifyDataSetChanged() }
需要注意的是如果訪問(wèn)一個(gè)還沒(méi)有初始化的變量或?qū)傩詫?huì)導(dǎo)致UninitializedPropertyAccessException異常。
還有一點(diǎn)需要注意的是lateinit并不能修飾基本數(shù)據(jù)類(lèi)型的變量或?qū)傩?,比如Int,Boolean等等,它會(huì)提示你
‘lateinit'modifier is nor allowed on properites of primitive types
此時(shí)你可以使用下面這個(gè)方式
private var mNumber: Int by Delegates.notNull<Int>()
3. 使用let函數(shù)
下面這段代碼的提示我們經(jīng)常會(huì)見(jiàn)到
studio提醒我們mPhotoUrl的value在執(zhí)行uploadPhoto時(shí)可能已經(jīng)改變,不能確定是否非空,通常我們的解決方式是這樣的
private var mPhotoUrl: String? = null fun uploadClicked() { if (mPhotoUrl != null) { uploadPhoto(mPhotoUrl!!) } }
然而如果你不想使用!! 這里還有一種更優(yōu)雅的方式
private var mPhotoUrl: String? = null fun uploadClicked() { mPhotoUrl?.let { uploadPhoto(it) } }
只有當(dāng)mPhotoUrl不為空時(shí)let中的代碼才會(huì)執(zhí)行
如果你對(duì)let函數(shù)還不了解,可以看我寫(xiě)的這篇文章
//www.dbjr.com.cn/article/131427.htm
4. 使用特定的函數(shù)處理復(fù)雜的場(chǎng)景
對(duì)于一些簡(jiǎn)單的場(chǎng)景l(fā)et函數(shù)是很好用的,就像上面的情況,但是對(duì)于一些復(fù)雜的場(chǎng)景,比如下面的代碼
if (mUserName != null && mPhotoUrl != null) { uploadPhoto(mUserName!!, mPhotoUrl!!) }
當(dāng)然你也可以使用let的方式處理,但是這樣代碼的可讀性就會(huì)降低了,這時(shí)候你可以定義一些特定的函數(shù)來(lái)解決這個(gè)問(wèn)題。
比如下面這個(gè)可以判斷兩個(gè)參數(shù)非空的函數(shù)
fun <T1, T2> ifNotNull(value1: T1?, value2: T2?, bothNotNull: (T1, T2) -> (Unit)) { if (value1 != null && value2 != null) { bothNotNull(value1, value2) } }
這樣你的代碼就變成了下面這樣
ifNotNull(mUserName, mPhotoUrl) { userName, photoUrl -> uploadPhoto(userName, photoUrl) }
See,!!操作符消失了。
5. 使用Elvis操作符
對(duì)于那些必有返回的情況,Elvis非常的實(shí)用。
Elvis操作符,?:左邊的返回值不為空則返回,否則返回?:右邊的值
fun getUserName(): String { if (mUserName != null) { return mUserName!! } else { return "Anonymous" } }
使用Elvis操作符后
fun getUserName(): String { return mUserName ?: "Anonymous" }
通過(guò)上面這幾種辦法基本上你可以清除程序中所有的!!操作符了,而且你的代碼也會(huì)變得更加健壯。如果你還有其他的方式請(qǐng)?jiān)谠u(píng)論區(qū)留言吧。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Android實(shí)現(xiàn)簡(jiǎn)單用戶注冊(cè)案例
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)單用戶注冊(cè)案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05Android衛(wèi)星菜單效果的實(shí)現(xiàn)方法
這篇文章主要介紹了Android衛(wèi)星菜單效果的實(shí)現(xiàn)方法,需要的朋友可以參考下2017-05-05Android開(kāi)發(fā)筆記之探秘WebView
瀏覽器控件是每個(gè)開(kāi)發(fā)環(huán)境都具備的,這為馬甲神功提供了用武之地,windows的有webbrowser,android和ios都有webview。只是其引擎不同,相對(duì)于微軟的webbrowser,android及ios的webview的引擎都是webkit,對(duì)Html5提供支持。本篇主要介紹android的webview。2014-08-08Flutter應(yīng)用集成極光推送的實(shí)現(xiàn)示例
這篇文章主要介紹了Flutter應(yīng)用集成極光推送的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Android實(shí)現(xiàn)從相冊(cè)選擇照片功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)從相冊(cè)選擇照片功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03android使用PullToRefresh實(shí)現(xiàn)下拉刷新和上拉加載
本篇文章主要介紹了android使用PullToRefresh實(shí)現(xiàn)下拉刷新和上拉加載,具有一定的參考價(jià)值,有興趣的可以了解一下。2016-12-12Android 打開(kāi)相冊(cè)選擇單張圖片實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 打開(kāi)相冊(cè)選擇單張圖片實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05Android高仿2048小游戲?qū)崿F(xiàn)代碼
這篇文章主要介紹了Android高仿2048小游戲?qū)崿F(xiàn)代碼的相關(guān)資料,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10