国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

kotlin代碼中!!操作符的清楚方法

2024-07-21 23:03:47
字體:
供稿:網(wǎng)友

前言

空安全是Kotlin中非常實(shí)用的特性,它能夠讓你避免許多隱藏的NullPointerExceptions問題。然而當(dāng)你使用AS將Java代碼轉(zhuǎn)換成Kotlin代碼后會(huì)出現(xiàn)很多的!! 操作符,因?yàn)槌霈F(xiàn)!!意味著這里可能有未捕獲的KotlinNullPointerException異常。

對(duì)于一個(gè)有強(qiáng)迫癥的程序猿來說一個(gè)類中大篇幅的出現(xiàn)!! 絕對(duì)會(huì)使他們發(fā)瘋的。幸運(yùn)的是我們可以通過以下方式避免使用!!操作符。

1. 使用val代替var

我們都知道val修飾的變量是只讀的,var修飾的變量是可變的,所以我們應(yīng)該盡可能多的使用val,因?yàn)槭褂胿al修飾的變量必須有一個(gè)value,這樣你就不用再擔(dān)心空指針的問題,所以如果你能確定一個(gè)變量可以定義成一個(gè)常量,那么請(qǐng)用val修飾它。

2. 使用lateinit

然而你并不能把所有的變量用val修飾,,比如那些需要在Activity的onCreate()中進(jìn)行初始換的變量,針對(duì)這個(gè)情況你可以考慮使用lateinit修飾變量,例如下面的代碼

private var mAdapter: RecyclerAdapter<Transaction>? = nulloverride 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()}

需要注意的是如果訪問一個(gè)還沒有初始化的變量或?qū)傩詫?huì)導(dǎo)致UninitializedPropertyAccessException異常。

還有一點(diǎn)需要注意的是lateinit并不能修飾基本數(shù)據(jù)類型的變量或?qū)傩裕热鏘nt,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ì)見到

kotlin,kotlin代碼,操作符

studio提醒我們mPhotoUrl的value在執(zhí)行uploadPhoto時(shí)可能已經(jīng)改變,不能確定是否非空,通常我們的解決方式是這樣的

private var mPhotoUrl: String? = nullfun uploadClicked() { if (mPhotoUrl != null) { uploadPhoto(mPhotoUrl!!) }}

然而如果你不想使用!! 這里還有一種更優(yōu)雅的方式

private var mPhotoUrl: String? = nullfun uploadClicked() { mPhotoUrl?.let { uploadPhoto(it) }}

只有當(dāng)mPhotoUrl不為空時(shí)let中的代碼才會(huì)執(zhí)行

如果你對(duì)let函數(shù)還不了解,可以看我寫的這篇文章

4. 使用特定的函數(shù)處理復(fù)雜的場景

對(duì)于一些簡單的場景l(fā)et函數(shù)是很好用的,就像上面的情況,但是對(duì)于一些復(fù)雜的場景,比如下面的代碼

if (mUserName != null && mPhotoUrl != null) { uploadPhoto(mUserName!!, mPhotoUrl!!)}

當(dāng)然你也可以使用let的方式處理,但是這樣代碼的可讀性就會(huì)降低了,這時(shí)候你可以定義一些特定的函數(shù)來解決這個(gè)問題。

比如下面這個(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"}

通過上面這幾種辦法基本上你可以清除程序中所有的!!操作符了,而且你的代碼也會(huì)變得更加健壯。如果你還有其他的方式請(qǐng)?jiān)谠u(píng)論區(qū)留言吧。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到kotlin教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 陆川县| 台中市| 同心县| 大理市| 通海县| 毕节市| 靖边县| 棋牌| 前郭尔| 福贡县| 太湖县| 红安县| 海丰县| 宝清县| 磐安县| 句容市| 江北区| 梨树县| 德令哈市| 古蔺县| 崇左市| 崇阳县| 博客| 中西区| 平舆县| 华蓥市| 景泰县| 涞水县| 禹州市| 余江县| 西乌珠穆沁旗| 东丽区| 万安县| 许昌县| 嘉峪关市| 平谷区| 儋州市| 岳池县| 资阳市| 清水河县| 安多县|