一、介紹
????????如今在Android開發(fā)中,應(yīng)用層開發(fā)語(yǔ)言主要是Java和Kotlin,Kotlin是后來(lái)加入的,主導(dǎo)的語(yǔ)言還是Java。kotlin的加入仿佛讓會(huì)kotlin語(yǔ)言的開發(fā)者更屌一些,其實(shí)不然。
????????有人說(shuō)kotlin的引入是解決開發(fā)者復(fù)雜的邏輯,并且對(duì)空指針控制的比較友好,但是我們?cè)陂_發(fā)過(guò)程中會(huì)發(fā)現(xiàn),好像并不是這么回事,甚至有些開發(fā)者發(fā)現(xiàn),在使用過(guò)程中會(huì)出現(xiàn)莫名其妙的錯(cuò)誤,而且還不好定位。
????????這時(shí)候,我們應(yīng)該去分析,kotlin適不適合自己,自己能不能駕馭?
二、分析Java與kotlin實(shí)戰(zhàn)中的利與弊
????????學(xué)過(guò)政治都知道,任何東西都是一把雙刃劍,既有好的一面也有不好的一面。不能什么都照搬過(guò)來(lái)。kotlin的好是建立在你已很好的掌握,但是不好的是你如果只會(huì)基礎(chǔ),在使用過(guò)程中,無(wú)法避免一些異常情況。但是Java的友好是適合新手使用,普及度高。
kotlin的弊端與分析
1、參數(shù)為null
參數(shù)為null這種很容易引起空指針,為什么會(huì)出現(xiàn)這種情況?是受Java的寫法有關(guān)系
Java:
public void log(String txt)
Kotlin:
public fun log(txt:String)
正常Java你是可以傳null進(jìn)去,但是在kotlin,你傳null就會(huì)報(bào)錯(cuò)
?分析:
Java中,你參數(shù)可以傳任何,你傳null也是沒(méi)問(wèn)題,但是你在kotlin中,就沒(méi)有這么隨意了,這是為什么呢?
?在kotlin中,任何參數(shù)都會(huì)被修飾,為空或者不為空,默認(rèn)是NotNull。如果你不能傳遞null值過(guò)去。
如何避免?
只要我們是通過(guò)kotlin語(yǔ)法,你在任何參數(shù)申明都需要設(shè)置成為可為null
public fun log(txt:String?)
這個(gè)時(shí)候,在參數(shù)中,已變成可為null。
2、lateinit 報(bào)錯(cuò)未初始化先使用
????????lateinit 是稍后初始化,這個(gè)只能做全局,不能出現(xiàn)在方法體,但是也有個(gè)問(wèn)題。如果你用lateinit 修飾一個(gè)變量,那么這個(gè)變量可以不先申明變量值,等使用時(shí)再初始化。
但是這個(gè)也會(huì)出現(xiàn)一個(gè)問(wèn)題,如果你沒(méi)初始化就使用會(huì)報(bào)錯(cuò)
lateinit var txt: String
public fun log() {
println(txt)
}
????????有人會(huì)說(shuō),我不能判空嘛?判空也不行。只要你使用之前就必須初始化,否則就會(huì)報(bào)錯(cuò)。這個(gè)問(wèn)題在新手特別容易犯錯(cuò)。
????????所以為什么這個(gè)關(guān)鍵字往往出現(xiàn)在修飾View的初始化使用比較多。這個(gè)在使用的時(shí)候進(jìn)行判空,所以該字段默認(rèn)為null,但是你使用必須要有值,只要你調(diào)用get方法就會(huì)觸發(fā)。
思考:
有人會(huì)問(wèn),如果我直接修改變量的get方法,如果為null,那么get直接給他初始化。
?lateinit不允許修改set和get。
????????但是Java就不會(huì),Java是所見(jiàn)即所得,你的東西就是你的東西,kotlin是通過(guò)自己的語(yǔ)言限制,翻譯成Java語(yǔ)言。所以,你不了解或者說(shuō)不清楚目標(biāo)類,很容易造成風(fēng)險(xiǎn),并且這種bug被帶到線上概率很大
3、參數(shù)類型強(qiáng)轉(zhuǎn)"!!"導(dǎo)致null空指針
這種錯(cuò)誤在方法調(diào)用很容易出現(xiàn),而且這種BUG的概率非常高,導(dǎo)致項(xiàng)目質(zhì)量很差。
public fun log(txt:String)
分析:
我們申請(qǐng)一個(gè)方法,參數(shù)不為null,在Java過(guò)程中,這種你不需要管,直接調(diào)用,一般對(duì)null的判斷會(huì)在方法體中進(jìn)行
Java:
public void log(String txt){
if(txt!=null){}
}
但是你在kotlin中,只能在調(diào)用處進(jìn)行判斷,否則就要將參數(shù)通過(guò)強(qiáng)制表示不為null,"!!"
我們?cè)陧?xiàng)目中進(jìn)程遇到log(msg!!)這種錯(cuò)誤的寫法,這種寫法,如果你的實(shí)參申請(qǐng)可以為null,但是形參不能為null,這個(gè)時(shí)候你只能通過(guò)"!!"來(lái)強(qiáng)轉(zhuǎn),但是:你的實(shí)參如果為null,這個(gè)時(shí)候就會(huì)報(bào)空指針,這是為什么?
這是因?yàn)槟愕膶?shí)參在調(diào)用時(shí)已進(jìn)行強(qiáng)制轉(zhuǎn)換,也會(huì)提前進(jìn)行空指針異常檢查,所以在使用?"!!"強(qiáng)轉(zhuǎn)符號(hào)時(shí),一定要判空,否則會(huì)報(bào)錯(cuò),但是Java中,我們隨便傳null。
4.形參為Val修飾的常量,無(wú)法修改
在kotlin中,形參是傳值類型,你是無(wú)法直接修改變量,必須通過(guò)其他變量接收完再修改
?默認(rèn)是Val類型
public fun addOne(item:Int):Int{
val relVal=item+1
return relVal
}
5.默認(rèn)為null的變量引用
默認(rèn)值為null,如果變量已申請(qǐng)為這種,那么你以后的使用將離不開"?"和"!!"轉(zhuǎn)換。
var temp:String?=null
這種區(qū)分全局和局部
1、全局:
如果是全局,對(duì)于IDE來(lái)說(shuō),任何時(shí)刻都有可能是null,所以在方法中使用,默認(rèn)當(dāng)成null來(lái)處理
?所以,你即使判空,還是不行。需要一輩子跟著"?"和"!!"搭配使用。
2、局部:
如果是局部,只要你在使用之前判斷過(guò)一次,在合理的校驗(yàn)范圍內(nèi)都是有效
public fun log(mm:String) {
var txt:String?=null
if (txt==null)
return
txt.length
}
就是這種有起義的原因,導(dǎo)致在實(shí)戰(zhàn)中,很多人很難理解
三、總結(jié)
????????通過(guò)kotlin的自身問(wèn)題,其實(shí)kotlin就是一種插件語(yǔ)言,最終還是翻譯成Java,只是目前來(lái)看,通過(guò)翻譯的目標(biāo)類,還是Java本身,但是增加了特別多的校驗(yàn),導(dǎo)致寫法和Java有很大的不同。這種不同來(lái)自我們的習(xí)慣問(wèn)題。有人提前判空,有人喜歡丟在使用出判空,調(diào)用處讓語(yǔ)法自然一些。
????????Android應(yīng)用不像PC,空指針是致命的BUG,出現(xiàn)一個(gè)就會(huì)導(dǎo)致崩潰。所以,kotlin對(duì)空指針校驗(yàn)特別嚴(yán)格,也對(duì)使用埋下了隱患,新手可以繞開校驗(yàn),但是對(duì)于繞開的原理不夠理解,就會(huì)引起崩潰。
????????kotlin也不是一無(wú)是處,他更像是一個(gè)插件,插件的好處是自然的,可擴(kuò)展等也是kotlin的自身優(yōu)勢(shì)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-508091.html
????????所以,通過(guò)上面的分析,大家可以自行去選擇項(xiàng)目中的語(yǔ)言,是kotlin還是Java,如果你向往kotlin的寫法,那么就得去了解kotlin的原理,以及要改變自己在Java中的開發(fā)習(xí)慣。kotlin是先判斷后使用,而Java寫法很隨意,由開發(fā)者自行定義,kotlin都是翻譯好的。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-508091.html
最后,用好可以事半功倍,用不好,會(huì)引起各種不好排查的BUG。最后送一句話:水能載舟亦能覆舟。
到了這里,關(guān)于Android 安卓開發(fā)語(yǔ)言kotlin與Java該如何選擇的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!