麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 23:03:47
字體:
來源:轉載
供稿:網友

前言

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

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

1. 使用val代替var

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

2. 使用lateinit

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

需要注意的是如果訪問一個還沒有初始化的變量或屬性將會導致UninitializedPropertyAccessException異常。

還有一點需要注意的是lateinit并不能修飾基本數據類型的變量或屬性,比如Int,Boolean等等,它會提示你

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

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

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

3. 使用let函數

下面這段代碼的提示我們經常會見到

kotlin,kotlin代碼,操作符

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

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

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

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

只有當mPhotoUrl不為空時let中的代碼才會執行

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

4. 使用特定的函數處理復雜的場景

對于一些簡單的場景let函數是很好用的,就像上面的情況,但是對于一些復雜的場景,比如下面的代碼

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

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

比如下面這個可以判斷兩個參數非空的函數

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"}

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到kotlin教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 美女扒开腿让男生桶爽网站 | 精精国产xxxx视频在线播放7 | 色婷婷久久久久久 | 久久色网站 | 久久精品视频16 | 久久美女色视频 | 一边吃奶一边摸下娇喘 | 污片视频网站 | 日本欧美一区二区三区在线观看 | 羞羞答答xxdd在线播放 | 91一区二区三区久久久久国产乱 | 久久久久久免费 | 高清国产免费 | 久久久久久三区 | 欧美wwwwww | 日本精品一二区 | 欧美a∨亚洲欧美亚洲 | 成人免费乱码大片a毛片视频网站 | 看一级毛片 | 超碰在线97国产 | 亚洲人成网在线观看 | 热99精品视频 | 亚洲午夜在线视频 | 国产免费v片 | 欧美一级黄视频 | 草久视频在线观看 | 成人性爱视频在线观看 | 日本黄色一级毛片 | 久久精品中文字幕一区二区 | 成人情欲视频在线看免费 | 娇妻被各种姿势c到高潮小说 | 精精国产xxxx视频在线野外 | 久久久精品网 | 成人午夜在线观看视频 | 国产一区二区三区高清 | 国产婷婷一区二区三区 | 激情夜色 | 亚洲综合视频网 | av在线观 | 蜜桃精品视频 | 国产午夜精品一区 |