成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Kotlin可空性探索

DataPipeline / 1761人閱讀

摘要:可空性在中,類型系統(tǒng)區(qū)分一個(gè)引用是可以容納可空引用還是不能容納非空引用。使用可以很方便得將可空轉(zhuǎn)為非空,但可空變量值為,則會(huì)。

目錄介紹

01.可空性

02.安全調(diào)用運(yùn)算符:?.

03.Elvis運(yùn)算符:?:

04.安全轉(zhuǎn)換運(yùn)算符:as?

05.非空斷言:!!

06.let函數(shù)說明

07.可空類型的擴(kuò)展

08.Java中判斷方式

09.kotlin是否解決NPE

10.kotlin如何約束非空判斷

11.導(dǎo)致NPE的場(chǎng)景

想換個(gè)工作,渴望同行內(nèi)推我

個(gè)人信息

姓名:楊充【26歲】

郵箱:[email protected]

微信:13667225184

GitHub:https://github.com/yangchong211

博客匯總:https://github.com/yangchong2...

干活集中營(yíng):Android端技術(shù)博客和開源項(xiàng)目審核員

目前工作情況:在職狀態(tài)

技術(shù)項(xiàng)目和博客:GitHub項(xiàng)目7k以上star,follower1.1k以上,發(fā)表博客100多篇。

熱愛技術(shù):開源項(xiàng)目和博客多次被鴻洋,郭霖,Android技術(shù)周刊,干活集中營(yíng)等等推薦。

學(xué)歷:武漢軟件工程職業(yè)學(xué)院,大專學(xué)歷

工作年限:3年多

工作地點(diǎn):北京

關(guān)于近期投遞簡(jiǎn)歷一點(diǎn)感想

從進(jìn)入Android這個(gè)行業(yè)以來,前兩次幾乎都是朋友內(nèi)推,面試機(jī)會(huì)相對(duì)容易,都是一個(gè)App一個(gè)人做或者兩個(gè)人做,用戶相對(duì)來說并不多。這次想著離職,主要是想進(jìn)入一個(gè)較大的平臺(tái),大概可以理解為Android端有個(gè)至少四五人,可以進(jìn)行技術(shù)交流,渴望自己能夠在技術(shù)上突破,這就像自己平時(shí)獨(dú)自跑步,和跟著一群跑馬拉松的人跑步,那種緊張感肯定是不一樣的。

近段時(shí)間,嘗試著向一些較大的公司投遞簡(jiǎn)歷,大概在拉鉤上投了15個(gè)左右(不喜歡海投),發(fā)現(xiàn)絕大多數(shù)簡(jiǎn)歷到不了技術(shù)那里,就被人事說學(xué)歷不夠,經(jīng)驗(yàn)不夠,工作不匹配等情況回絕。不過也可以理解,看簡(jiǎn)歷無非就是學(xué)歷和經(jīng)驗(yàn),貌似自己的履歷是差了一點(diǎn)。

這大概是第一次在網(wǎng)上發(fā)一個(gè)主動(dòng)希望同行內(nèi)推的介紹,如果你的公司有Android方面的招聘,能否內(nèi)推一下我這個(gè)小人物,感謝。

01.可空性

在 Kotlin 中,類型系統(tǒng)區(qū)分一個(gè)引用是可以容納 null (可空引用)還是不能容納(非空引

用)。 例如,String 類型的常規(guī)變量不能指向 null

var name: String = "yc"
//編譯錯(cuò)誤
//name = null

如果希望一個(gè)變量可以儲(chǔ)存 null 引用,需要顯式地在類型名稱后面加上問好來標(biāo)記它:

var name: String? = "yc"
name = null

問號(hào)可以加在任何類型的后面來表示這個(gè)類型的變量可以存儲(chǔ) null 引用:Int?、Doubld? 、Long? 等

Kotlin 對(duì)可空類型的顯式支持有助于防止 NullPointerException 導(dǎo)致的異常問題,編譯器不允許不對(duì)可空變量做 null 檢查就直接調(diào)用其屬性

fun check(name: String?): Boolean {
    //編譯器不允許不對(duì) name 做 null 檢查就直接調(diào)用其屬性
    return name.isNotEmpty()
}

需要顯式地進(jìn)行 null 檢查

fun check(name: String?): Boolean {
    if (name != null) {
        return name.isNotEmpty()
    }
    return false
}

02.安全調(diào)用運(yùn)算符:?.

安全調(diào)用運(yùn)算符:?.

允許把一次 null 檢查和一次方法調(diào)用合并為一個(gè)操作,如果變量值非空,則方法或?qū)傩詴?huì)被調(diào)用,否則直接返回 null

例如,以下兩種寫法是完全等同的:

fun check(name: String?) {
    if (name != null) {
        println(name.toUpperCase())
    } else {
        println(null)
    }
}

fun check(name: String?) {
    println(name?.toUpperCase())
}

03.Elvis運(yùn)算符:?:

Elvis 運(yùn)算符:?:

用于替代 ?. 直接返回默認(rèn)值 null 的情況,Elvis 運(yùn)算符接收兩個(gè)運(yùn)算數(shù),如果第一個(gè)運(yùn)算數(shù)不為 null ,運(yùn)算結(jié)果就是其運(yùn)算結(jié)果值,如果第一個(gè)運(yùn)算數(shù)為 null ,運(yùn)算結(jié)果就是第二個(gè)運(yùn)算數(shù)

例如,以下兩種寫法是完全等同的:

fun check(name: String?) {
    if (name != null) {
        println(name)
    } else {
        println("yc")
    }
}

fun check(name: String?) {
    println(name ?: "yc")
}

04.安全轉(zhuǎn)換運(yùn)算符:as?

安全轉(zhuǎn)換運(yùn)算符:as? 用于把值轉(zhuǎn)換為指定的類型,如果值不適合該類型則返回 null

fun check(any: Any?) {
    val result = any as? String
    println(result ?: println("is not String"))
}

05.非空斷言:!!

非空斷言用于把任何值轉(zhuǎn)換為非空類型,如果對(duì) null 值做非空斷言,則會(huì)拋出異常

fun main(args: Array) {
    var name: String? = "yc"
    check(name) //7

    name = null
    check(name) //KotlinNullPointerException
}

fun check(name: String?) {
    println(name!!.length)
}

06.let函數(shù)說明

let 函數(shù)可用于在表達(dá)式不為 null 時(shí)才執(zhí)行指定代碼塊

fun main(args: Array) {
    var name: String? = "yc"
    check(name) //yc

    name = null
    check(name) //什么都不會(huì)輸出
}

fun check(name: String?) {
    name?.let {
        println(name)
    }
}

07.可空類型的擴(kuò)展

為可空類型定義擴(kuò)展函數(shù)是一種更強(qiáng)大的處理 null 值的方式,可以允許接收者為 null 的調(diào)用,并在該函數(shù)中處理 null ,而不是在確保變量不為 null 之后再調(diào)用它的方法

例如,如下方法可以被正常調(diào)用而不會(huì)發(fā)生空指針異常

val name: String? = null
println(name.isNullOrEmpty()) //true

isNullOrEmpty() 的方法簽名如下所示,可以看到這是為可空類型 CharSequence? 定義的擴(kuò)展函數(shù),方法中已經(jīng)處理了方法調(diào)用者為 null 的情況

@kotlin.internal.InlineOnly
public inline fun CharSequence?.isNullOrEmpty(): Boolean {
    contract {
        returns(false) implies (this@isNullOrEmpty != null)
    }

    return this == null || this.length == 0
}

08.Java中判斷方式 8.1 防御式編程

“防御式編程”大家應(yīng)該不陌生,核心思想是不信任任何“外部”輸入。

不管是真實(shí)的用戶輸入還是其他模塊傳入的實(shí)參,具體點(diǎn)就是各種判空。創(chuàng)建一個(gè)方法需要判空,創(chuàng)建一個(gè)邏輯塊需要判空,甚至自己的代碼內(nèi)部也需要判空(防止對(duì)象的回收之類的)。

public void showToast(Activity activity) {
   if (activity == null) {
       return;
   }
}

8.2 契約式編程

各個(gè)模塊之間約定好一種規(guī)則,大家按照規(guī)則來辦事,出了問題找沒有遵守規(guī)則的人負(fù)責(zé),這樣可以避免大量的判空邏輯。Android 提供了相關(guān)的注解以及最基礎(chǔ)的檢查來協(xié)助開發(fā)者,示例如下:博客

public void showToast(@NonNull Activity activity) {
   ......
}

給 Activity 增加了 @NonNull 的注解,就是向所有調(diào)用這個(gè)方法的人聲明了一個(gè)約定,調(diào)用方應(yīng)該保證傳入的 activity 非空。當(dāng)然聰明的你應(yīng)該知道,這是一個(gè)很弱的限制,調(diào)用方?jīng)]注意或者不理會(huì)這個(gè)注解的話,程序就依然還有 NPE 導(dǎo)致的 crash 的風(fēng)險(xiǎn)。

09.kotlin是否解決NPE

有些文章說 Kotlin 幫開發(fā)者解決了NPE(NullPointerException),這個(gè)說法是不對(duì)的。Kotlin沒有幫開發(fā)者解決了NPE,而是通過在語言層面增加各種強(qiáng)規(guī)則,強(qiáng)制開發(fā)者去自己處理可能的空指針問題,達(dá)到盡量減少(只能減少而無法完全避免)出現(xiàn) NPE 的目的。

10.kotlin如何約束非空判斷

聲明階段

變量需要決定自己是否可為空,比如 private var goodsId: String ?= null,這樣就是可接受 null

傳遞階段

在變量傳遞階段,必須保持“可空性”一致,比如形參聲明是不為空的,那么實(shí)參必須本身是非空或者轉(zhuǎn)為非空才能正常傳遞。示例如下:

private var goodsId: String? = null
private fun Main(){
    getName(goodsId!!)
}

private fun getName(name : String){
    Log.i("", "---$name")
}

還有一種方式,在方法中添加?

private fun Main(){
    getName(goodsId)
}

private fun getName(name : String?){
    Log.i("", "---$name")
}

使用階段

在使用階段,需要嚴(yán)格判空

var time: Long? = 1000

private fun Main(){
    time!!.toFloat()
    time?.toInt()
}

得出結(jié)論

總的來說 Kotlin 為了解決 NPE 做了大量語言層級(jí)的強(qiáng)限制,的確可以做到減少 NPE 的發(fā)生。但這種既“契約式”(判空)又“防御式”(聲明空與非空)的方案會(huì)讓開發(fā)者做更多的工作,會(huì)更“麻煩”一點(diǎn)。

11.導(dǎo)致NPE的場(chǎng)景 11.1 方法參數(shù)聲明非空

比如,請(qǐng)求網(wǎng)絡(luò)接口,需要傳遞參數(shù),這種情況下每個(gè)字段都可能為空,為了增強(qiáng)邏輯,可以在方法參數(shù)上加上"?",可以避免后端處理參數(shù)值時(shí)拋出空指針異常。博客

/**

 */
@POST("user/login")
fun userLogin(
        @Query("username") userName: String?,
        @Query("password") password: String?
): Observable>
```

11.2 !! 強(qiáng)行轉(zhuǎn)為非空

當(dāng)將可空類型賦值給非空類型時(shí),需要有對(duì)空類型的判斷,確保非空才能賦值(Kotlin 的約束)。使用!! 可以很方便得將“可空”轉(zhuǎn)為“非空”,但可空變量值為 null,則會(huì) crash。

因此使用上建議在確保非空時(shí)才用 !!: param!!

否則還是盡量放在判空代碼塊里:

param?.let {
   doSomething(it)
}

想換個(gè)工作,渴望同行內(nèi)推我

個(gè)人信息

姓名:楊充【26歲】

郵箱:[email protected]

微信:13667225184

GitHub:https://github.com/yangchong211

博客匯總:https://github.com/yangchong2...

干活集中營(yíng):Android端技術(shù)博客和開源項(xiàng)目審核員

目前工作情況:在職狀態(tài)

技術(shù)項(xiàng)目和博客:GitHub項(xiàng)目7k以上star,follower1.1k以上,發(fā)表博客100多篇。

熱愛技術(shù):開源項(xiàng)目和博客多次被鴻洋,郭霖,Android技術(shù)周刊,干活集中營(yíng)等等推薦。

學(xué)歷:武漢軟件工程職業(yè)學(xué)院,大專學(xué)歷

工作年限:3年多

工作地點(diǎn):北京

關(guān)于近期投遞簡(jiǎn)歷一點(diǎn)感想

從進(jìn)入Android這個(gè)行業(yè)以來,前兩次幾乎都是朋友內(nèi)推,面試機(jī)會(huì)相對(duì)容易,都是一個(gè)App一個(gè)人做或者兩個(gè)人做,用戶相對(duì)來說并不多。這次想著離職,主要是想進(jìn)入一個(gè)較大的平臺(tái),大概可以理解為Android端有個(gè)至少四五人,可以進(jìn)行技術(shù)交流,渴望自己能夠在技術(shù)上突破,這就像自己平時(shí)獨(dú)自跑步,和跟著一群跑馬拉松的人跑步,那種緊張感肯定是不一樣的。

近段時(shí)間,嘗試著向一些較大的公司投遞簡(jiǎn)歷,大概在拉鉤上投了15個(gè)左右(不喜歡海投),發(fā)現(xiàn)絕大多數(shù)簡(jiǎn)歷到不了技術(shù)那里,就被人事說學(xué)歷不夠,經(jīng)驗(yàn)不夠,工作不匹配等情況回絕。不過也可以理解,看簡(jiǎn)歷無非就是學(xué)歷和經(jīng)驗(yàn),貌似自己的履歷是差了一點(diǎn)。

這大概是第一次在網(wǎng)上發(fā)一個(gè)主動(dòng)希望同行內(nèi)推的介紹,如果你的公司有Android方面的招聘,能否內(nèi)推一下我這個(gè)小人物,感謝。

關(guān)于其他內(nèi)容介紹 01.關(guān)于博客匯總鏈接

1.技術(shù)博客匯總

2.開源項(xiàng)目匯總

3.生活博客匯總

4.喜馬拉雅音頻匯總

5.其他匯總

02.關(guān)于我的博客

github:https://github.com/yangchong211

知乎:https://www.zhihu.com/people/...

簡(jiǎn)書:http://www.jianshu.com/u/b7b2...

csdn:http://my.csdn.net/m0_37700275

喜馬拉雅聽書:http://www.ximalaya.com/zhubo...

開源中國(guó):https://my.oschina.net/zbj161...

泡在網(wǎng)上的日子:http://www.jcodecraeer.com/me...

郵箱:[email protected]

阿里云博客:https://yq.aliyun.com/users/a... 239.headeruserinfo.3.dT4bcV

segmentfault頭條:https://segmentfault.com/u/xi...

掘金:https://juejin.im/user/593943...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75129.html

相關(guān)文章

  • Kotlin 極簡(jiǎn)教程 》第4章 基本數(shù)據(jù)類型與類型系統(tǒng)

    摘要:本章我們來學(xué)習(xí)一下的基本數(shù)據(jù)類型與類型系統(tǒng)。字符串就是一個(gè)抽象數(shù)據(jù)類型。如果程序語言的語法中含有類型標(biāo)記,就稱該語言是顯式類型化的,否則就稱為隱式類型化的。但是,可以把中對(duì)應(yīng)的這幾種基本數(shù)據(jù)類型,理解為的基本類型的裝箱類。 第4章 基本數(shù)據(jù)類型與類型系統(tǒng) 《Kotlin極簡(jiǎn)教程》正式上架: 點(diǎn)擊這里 > 去京東商城購(gòu)買閱讀 點(diǎn)擊這里 > 去天貓商城購(gòu)買閱讀 非常感謝您親愛的讀...

    MoAir 評(píng)論0 收藏0
  • 從零開始學(xué) Kotlin 之「2」數(shù)據(jù)類型

    摘要:前言大家好,這里是從零開始學(xué)之?dāng)?shù)據(jù)類型,本文首發(fā)于公眾號(hào),歡迎前往大家關(guān)注。輸出布爾類型中的布爾類型用表示,它的值有和。若需要可空引用時(shí),布爾類型的值會(huì)被裝箱。此時(shí)程序會(huì)拋出異常最后從零開始學(xué)之?dāng)?shù)據(jù)類型到這里就結(jié)束了。 前言 大家好,這里是「從零開始學(xué) Kotlin 之『2 』數(shù)據(jù)類型」,本文首發(fā)于公眾號(hào)「Binguner」,歡迎前往大家關(guān)注。我會(huì)每周分享一些關(guān)于 Android 和...

    Awbeci 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<