kotlin的一些關(guān)鍵字

讓你的kotlin代碼遠離!!

對于 Null 的檢查是 Kotlin 的特點之一胳岂。強制你在編碼過程中考慮變量是否可為 null宏所,因此可以避免很多在 Java 中隱藏的 NullPointerException。

但是逛揩,當你用插件直接將 Java 代碼轉(zhuǎn)換為 Kotlin 時蹈集,你會發(fā)現(xiàn)有很多 !! 在里面。但其實 !! 意味著「有一個潛在未處理的 KotlinNullPointerException 在這里」茂缚。

這里就介紹 6 個避免 !! 的方法:

1. 用 val 而不是 var

在 Kotlin 中 val 代表只讀,var 代表可變屋谭。建議盡可能多的使用 val脚囊。val 是線程安全的,并且不需要擔(dān)心 null 的問題桐磁。只需要注意 val 在某些情況下也是可變的就行了悔耘。

2. 使用 lateinit

有些情況我們不能使用 val,比如我擂,在 Android 中某些屬性需要在 onCreate() 方法中初始化衬以。對于這種情況缓艳,Kotlin 提供了 lateinit 關(guān)鍵字。

private lateinit var mAdapter: RecyclerAdapter<Transaction>

override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   mAdapter = RecyclerAdapter(R.layout.item_transaction)
}

fun test() {
   mAdapter.notifyDataSetChanged()
}

要注意看峻,訪問未初始化的 lateinit 屬性會導(dǎo)致 UninitializedPropertyAccessException阶淘。

并且 lateinit 不支持基礎(chǔ)數(shù)據(jù)類型,比如 Int互妓。對于基礎(chǔ)數(shù)據(jù)類型溪窒,我們可以這樣:

private var mNumber: Int by Delegates.notNull()

3. 使用 let 函數(shù)

下面是 Kotlin 代碼常見的編譯錯誤:

許多開發(fā)者都會選擇 臨時應(yīng)急方法:

private var mPhotoUrl: String? = null

fun uploadClicked() {
    mPhotoUrl?.let { uploadPhoto(it) }
}

但這里選擇 let 函數(shù)是一個更優(yōu)雅的解決方法:

private var mPhotoUrl: String? = null

fun uploadClicked() {
    mPhotoUrl?.let { uploadPhoto(it) }
}

4. 創(chuàng)建全局函數(shù)來處理更復(fù)雜的情況

let 是一個對于 null 檢查很好的替代品,但有時我們會遇到更復(fù)雜的情況冯勉。比如:

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

你可以選擇嵌套兩個 let澈蚌,但這樣可讀性并不好。這時你可以構(gòu)建一個全局函數(shù):

fun <T1, T2> ifNotNull(value1: T1?, value2: T2?, bothNotNull: (T1, T2) -> (Unit)) {
   if (value1 != null && value2 != null) {
       bothNotNull(value1, value2)
   }
}

簡單調(diào)用 ifNotNull("", "", { a, b -> print("$a $b") })

  1. 使用 Elvis 運算符
    Elvis 運算符在 Groovy 和 PHP 等語言中都存在灼狰。對于當值可能為 null 的情況特別方便:
fun getUserName(): String {
   if (mUserName != null) {
       return mUserName!!
   } else {
       return "Anonymous"
   }
}

上面的代碼就可以簡化為:

fun getUserName(): String {
   return mUserName ?: "Anonymous"
}

為什么叫 Elvis 呢宛瞄?因為 ?: 很像貓王的發(fā)型:

6. 自定義崩潰信息

如果我們使用 !!,那么當這個變量為 null 時交胚,只會簡單的拋出一個 KotlinNullPointerException份汗。這時我們可以用 requireNotNullcheckNotNull 來附帶異常信息,方便我們調(diào)試承绸。

uploadPhoto(requireNotNull(intent.getStringExtra("PHOTO_URL"), { "Activity parameter 'PHOTO_URL' is missing" }))

總而言之裸影,絕大多數(shù)情況下你都不需要 !!,可以用上面提到的 6 個技巧來消除 !!军熏。這樣能讓代碼更安全、更容易 debug 并且更干凈卷扮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荡澎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子晤锹,更是在濱河造成了極大的恐慌摩幔,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞭铆,死亡現(xiàn)場離奇詭異或衡,居然都是意外死亡,警方通過查閱死者的電腦和手機车遂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門封断,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舶担,你說我怎么就攤上這事坡疼。” “怎么了衣陶?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵柄瑰,是天一觀的道長闸氮。 經(jīng)常有香客問我,道長教沾,這世上最難降的妖魔是什么蒲跨? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮授翻,結(jié)果婚禮上财骨,老公的妹妹穿的比我還像新娘。我一直安慰自己藏姐,他們只是感情好隆箩,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著羔杨,像睡著了一般捌臊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兜材,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天理澎,我揣著相機與錄音,去河邊找鬼曙寡。 笑死糠爬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的举庶。 我是一名探鬼主播执隧,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼户侥!你這毒婦竟也來了镀琉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蕊唐,失蹤者是張志新(化名)和其女友劉穎屋摔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體替梨,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡钓试,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了副瀑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弓熏。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俗扇,靈堂內(nèi)的尸體忽然破棺而出硝烂,到底是詐尸還是另有隱情,我是刑警寧澤铜幽,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布滞谢,位于F島的核電站串稀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏狮杨。R本人自食惡果不足惜母截,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望橄教。 院中可真熱鬧清寇,春花似錦、人聲如沸护蝶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽持灰。三九已至盔夜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堤魁,已是汗流浹背喂链。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妥泉,地道東北人椭微。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像盲链,于是被迫代替她去往敵國和親蝇率。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容