欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年06月26日 10:34:07   作者:Knight_Davion  
這篇文章主要給大家介紹了關(guān)于kotlin代碼中?。〔僮鞣那宄椒?,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

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

1. 使用val代替var

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

2. 使用lateinit

然而你并不能把所有的變量用val修飾,,比如那些需要在Activity的onCreate()中進(jìn)行初始換的變量,針對這個情況你可以考慮使用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()
}

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

還有一點需要注意的是lateinit并不能修飾基本數(shù)據(jù)類型的變量或?qū)傩?,比如Int,Boolean等等,它會提示你

‘lateinit'modifier is nor allowed on properites of primitive types

此時你可以使用下面這個方式

private var mNumber: Int by Delegates.notNull<Int>()

3. 使用let函數(shù)

下面這段代碼的提示我們經(jīng)常會見到

studio提醒我們mPhotoUrl的value在執(zhí)行uploadPhoto時可能已經(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不為空時let中的代碼才會執(zhí)行

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

//www.dbjr.com.cn/article/131427.htm

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

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

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

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

比如下面這個可以判斷兩個參數(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操作符

對于那些必有返回的情況,Elvis非常的實用。

Elvis操作符,?:左邊的返回值不為空則返回,否則返回?:右邊的值

fun getUserName(): String {
 if (mUserName != null) {
 return mUserName!!
 } else {
 return "Anonymous"
 }
}

使用Elvis操作符后

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

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

總結(jié)

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

相關(guān)文章

  • Android?Flutter繪制扇形圖詳解

    Android?Flutter繪制扇形圖詳解

    在開發(fā)過程中通常會遇到一些不規(guī)則的UI,比如不規(guī)則的線條,多邊形,統(tǒng)計圖表等等,用那些通用組件通過組合的方式無法進(jìn)行實現(xiàn),這就需要我們自己進(jìn)行繪制。本文將利用Flutter繪制扇形圖,感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • Android實現(xiàn)簡單用戶注冊案例

    Android實現(xiàn)簡單用戶注冊案例

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)簡單用戶注冊案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Android衛(wèi)星菜單效果的實現(xiàn)方法

    Android衛(wèi)星菜單效果的實現(xiàn)方法

    這篇文章主要介紹了Android衛(wèi)星菜單效果的實現(xiàn)方法,需要的朋友可以參考下
    2017-05-05
  • Android開發(fā)筆記之探秘WebView

    Android開發(fā)筆記之探秘WebView

    瀏覽器控件是每個開發(fā)環(huán)境都具備的,這為馬甲神功提供了用武之地,windows的有webbrowser,android和ios都有webview。只是其引擎不同,相對于微軟的webbrowser,android及ios的webview的引擎都是webkit,對Html5提供支持。本篇主要介紹android的webview。
    2014-08-08
  • Android app本地切換logo和名稱

    Android app本地切換logo和名稱

    大家好,本篇文章主要講的是Android app本地切換logo和名稱,感興趣的同學(xué)趕快來看一看,對你有幫助的話記得收藏一下
    2022-02-02
  • Flutter應(yīng)用集成極光推送的實現(xiàn)示例

    Flutter應(yīng)用集成極光推送的實現(xiàn)示例

    這篇文章主要介紹了Flutter應(yīng)用集成極光推送的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Android實現(xiàn)從相冊選擇照片功能

    Android實現(xiàn)從相冊選擇照片功能

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)從相冊選擇照片功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • android使用PullToRefresh實現(xiàn)下拉刷新和上拉加載

    android使用PullToRefresh實現(xiàn)下拉刷新和上拉加載

    本篇文章主要介紹了android使用PullToRefresh實現(xiàn)下拉刷新和上拉加載,具有一定的參考價值,有興趣的可以了解一下。
    2016-12-12
  • Android 打開相冊選擇單張圖片實現(xiàn)代碼

    Android 打開相冊選擇單張圖片實現(xiàn)代碼

    這篇文章主要介紹了Android 打開相冊選擇單張圖片實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Android高仿2048小游戲?qū)崿F(xiàn)代碼

    Android高仿2048小游戲?qū)崿F(xiàn)代碼

    這篇文章主要介紹了Android高仿2048小游戲?qū)崿F(xiàn)代碼的相關(guān)資料,非常不錯具有一定的參考借鑒價值,需要的朋友可以參考下
    2016-10-10

最新評論