建站服務(wù)器 你好,世界
Kotlin是一種靜態(tài)類型語言,在JVM上運(yùn)行,并且與現(xiàn)有Java代碼具有100%的互操作性。 對(duì)于大多數(shù)Java開發(fā)人員來說,下面的程序應(yīng)該非常熟悉:
創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供青山湖網(wǎng)站建設(shè)、青山湖做網(wǎng)站、青山湖網(wǎng)站設(shè)計(jì)、青山湖網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、青山湖企業(yè)網(wǎng)站模板建站服務(wù),十余年青山湖做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。包c(diǎn)om。bugsnag??铺亓?
公共課App{
publicstaticvoidmain(String[]args){
系統(tǒng)。出。println(“HelloWorld!”);
}
}
以下將在 Kotlin中 打印“Hello World” :
funmain(args:Array){
println(“HelloWorld!”)
}
一些差異是顯而易見的,例如缺少分號(hào)以及我們的代碼是多么簡(jiǎn)潔。
科特林與 Java的為了了解Kotlin,讓我們仔細(xì)看看它的功能以及它們與Java的比較。
無安全性
我們將首先探索Kotlin最有用的功能之一 - 它支持null安全性。
在Java中,任何對(duì)象都可以
null
。
這意味著必須在整個(gè)代碼庫中添加運(yùn)行時(shí)檢查以防止
NullPointerException
崩潰,這通常被
語言設(shè)計(jì)者
稱為
十億美元的錯(cuò)誤
。
靜態(tài)類用戶{
字符串名稱;
}
publicvoidprintUsername(Useruser){
如果(用戶。名字!=空){
FOO(用戶。名。長(zhǎng)度());
}
}
在Kotlin中,對(duì)象的引用必須是可空的或非空的:
classUser(varname:String?)//name屬性可以為null
classUser(varname:String)//name屬性不能為null
如果開發(fā)人員試圖將可以為空的對(duì)象傳遞給第二個(gè)類,則會(huì)發(fā)生編譯時(shí)錯(cuò)誤。
安全呼叫運(yùn)營商
以下對(duì)大多數(shù)Java開發(fā)人員來說非常熟悉。
所述
user
參數(shù)可以是
null
,所以需要運(yùn)行時(shí)檢查以確保
NPE
避免。
voidprintUsername(Useruser){
如果(用戶。的getName()!=空){
FOO(用戶。的getName()長(zhǎng)度());
}else{
foo(null);//提供一個(gè)null整數(shù)
}
}
voidfoo(整數(shù)長(zhǎng)度){}
Kotlin可以通過
Safe Call
操作員
簡(jiǎn)化這一過程
。
如果
name
不為null,則其長(zhǎng)度將作為參數(shù)傳遞。
否則,將傳遞空引用。
funprintUsername(user:User){
FOO(用戶。名字?。長(zhǎng)度)如果user.name為空//返回null
}
funfoo(length:Int?){}
或者,如果在值為null時(shí)執(zhí)行代碼沒有意義,我們可以使用
let
:
funfoo(nullableUser:User?){
nullableUser?。let{printUsername(nullableUser)}//只打印非空用戶名
}
funprintUsername(user:User){}//User是非空引用類定義
與Java相比, Kotlin 類 非常簡(jiǎn)潔。 下面的類定義了三個(gè)字段,getter和setter超過30行!
classUser{
最終字符串名稱;
intage=18;
字符串地址;
publicUser(Stringname,intage,Stringaddress){
這個(gè)。name=name;
這個(gè)。年齡=年齡;
這個(gè)。地址=地址;
}
publicStringgetName(){
返回名稱;
}
publicintgetAge(){
回歸年齡;
}
publicvoidsetAge(intage){
這個(gè)。年齡=年齡;
}
publicStringgetAddress(){
返回地址;
}
publicvoidsetAddress(Stringaddress){
這個(gè)。地址=地址;
}
}
在Kotlin中,我們可以使用一行代碼實(shí)現(xiàn)相同的功能。
classUser(valname:String,varage:Int=18,varaddress:String?)
不可變引用也更容易。
這只是從
var
關(guān)鍵字
切換
到的問題
val
。
您可能已經(jīng)注意到,對(duì)于Kotlin,可以為參數(shù)提供默認(rèn)值。 這意味著 可以在Kotlin中消除 Java模式,例如 Builder模式 。 這也可以大大減少語法糖所需的代碼量,例如公共API中的方法鏈。
數(shù)據(jù)類如果我們類的主要目的是保存數(shù)據(jù),例如來自API的JSON有效負(fù)載,事情會(huì)變得更加簡(jiǎn)潔。 在Kotlin中,這些被稱為 數(shù)據(jù)類 。
dataclassUser(valname:String,varage:Int=18,varaddress:String?)
只需添加
data
關(guān)鍵字會(huì)自動(dòng)生成
equals()
,
hashCode()
,
toString()
,并
copy()
為我們的類實(shí)現(xiàn)。
省略了此類的等效Java實(shí)現(xiàn),以節(jié)省讀者的理智和帶寬成本。
Kotlin使用類型推斷,這進(jìn)一步增加了它的簡(jiǎn)潔性。 考慮一下這個(gè)Java類:
classAbstractSingletonProxyFactoryBean{}
publicvoidfoo(){
AbstractSingletonProxyFactoryBeanbean=newAbstractSingletonProxyFactoryBean();
}
而Kotlin中的等價(jià)物看起來像這樣:
classAbstractSingletonProxyFactoryBean
funfoo(){
valbean=AbstractSingletonProxyFactoryBean()//自動(dòng)推斷類型
}功能
類型推斷滲透到整個(gè)語言中。 在需要時(shí)可以是顯式的或隱式的,如下面定義相同函數(shù)的兩種方法所示:
intadd(inta,intb){
返回a+b;
}
funadd(a:Int,b:Int):Int{//顯式返回類型
返回a+b
}
funadd(a:Int,b:Int)=a+b//推斷的返回類型屬性
Kotlin Properties 簡(jiǎn)直太棒了。 考慮以下Java類,它使用訪問器方法定義單個(gè)字段:
classBook{
字符串作者;
StringgetAuthor(){
回歸作者;
}
voidsetAuthor(Stringauthor){
這個(gè)。作者=作者;
}
}
書書=新的圖書();
書。setAuthor(“KurtVonnegut”);
系統(tǒng)。出。的println(書。getAuthor());
通過定義聲明
author
屬性
的類,可以在Kotlin的四行中實(shí)現(xiàn)等效功能
。
我們將自動(dòng)生成我們的getter和setter:
classBook(varauthor:String?)
valbook=書()
書。author=“KurtVonnegut”
println(書。作者)自定義訪問者
如果getter和setter需要自定義行為,則可以覆蓋默認(rèn)行為。 例如:
classPerson(varfirstName:String,varlastName:String){
varfullName:String
get()=“${firstName}${lastName}”
set(value){
valsplit=value。拆分(“”)
firstName=split[0]
lastName=split[1]
}
}
如果我們需要驗(yàn)證字段或?qū)⑵湎拗茷槟承┹斎耄? 也可以使用 支持字段 :
set(value){
如果(“圣誕老人”。等于(值))字段=“蠔HO”
}互通性
Kotlin的另一個(gè)優(yōu)點(diǎn)是可以從同一個(gè)項(xiàng)目中的Java代碼中調(diào)用它,反之亦然。
公共類MyJavaClass{
publicStringauthorName;
publicbooleanisTruthyValue(){
返回true;
}
}
以下Kotlin函數(shù)實(shí)例化一個(gè)新的Java對(duì)象,并使用常規(guī)的Kotlin語法訪問其方法和字段。 如果您想通過向現(xiàn)有Java代碼庫添加少量Kotlin來將腳趾浸入水中,這將非常方便。
funmain(args:Array){
valobj=MyJavaClass()
的println(OBJ。AUTHORNAME)
的println(OBJ。isTruthyValue)
}
還值得一提的是,Kotlin可以 反編譯回Java ,因此如果您的團(tuán)隊(duì)不喜歡該語言或遇到技術(shù)障礙,那么完全可以遷移回來。
實(shí)用方法所有Java開發(fā)人員都會(huì)非常熟悉實(shí)用程序或幫助程序類。 靜態(tài)方法將執(zhí)行Java標(biāo)準(zhǔn)庫中不可用的一些有用操作,并將在代碼庫中調(diào)用:
classStringUtils{
staticStringsortStringChars(Stringinput){
char[]chars=輸入。toCharArray();
數(shù)組。排序(字符);
returnnewString(chars);
}
}
StringUtils。sortStringChars(“azbso”);//返回“abosz”
在Kotlin中,
擴(kuò)展
允許將其他功能添加到現(xiàn)有類中,
無需擴(kuò)展或包裝該類。
例如,以下內(nèi)容將向
該類
添加一個(gè)
sortStringChars
函數(shù)
String
:
有趣的字串。sortStringChars():String{
valchars=這個(gè)。toCharArray()
數(shù)組。排序(字符)
returnString(chars)
}
funmain(args:Array){
“azbso”。sortStringChars()//返回“abosz”
}
這導(dǎo)致語法更易讀 - 但要注意。 強(qiáng)大的力量帶來了 巨大的責(zé)任 。
功能編程Kotlin完全支持lambda表達(dá)式。 有限的Java 8支持剛剛 添加到Android中 ,這使得Kotlin的功能編程功能特別受歡迎。
//為名稱以“J”開頭的所有作者篩選一個(gè)列表
valinput=listOf(“JK羅琳”,“查爾斯達(dá)爾文”)
valauthors=輸入。過濾器{作者->作者。startsWith(“J”)}
println(作者)//JK羅琳
也可以
在Collections上
使用諸如
filter
和
map
直接
構(gòu)造
,這在大多數(shù)Android設(shè)備上目前都不支持。
funmain(args:Array){
valinput=listOf(“JK羅琳”,“查爾斯達(dá)爾文”,“”)
valauthors=輸入。過濾{!它。isEmpty()}//刪除空值
。map{Author(it)}//將字符串映射到作者對(duì)象
。sortedBy{it。name}//按作者名排序
println(authors)//按字母順序打印作者
}
Reactive Streams最近在Android世界中流行起來, RxKotlin 庫 也為Kotlin提供了支持 。
valcereals=listOf(“KellogsCoroutines”,“CocoaPods”,“LockyCharms”)
谷物。toObservable()
//在后臺(tái)線程上執(zhí)行一些密集/復(fù)雜的計(jì)算
。subscribeBy(onNext={
println(it)//觀察主線上的每個(gè)谷物并打印出來
})Kotlin Native和Javascript
Kotlin主要針對(duì)JVM,但也可以 使用LLVM工具鏈 轉(zhuǎn)換為Javascript 或編譯為本機(jī)代碼。 這兩個(gè)目標(biāo)在開發(fā)階段還處于初期階段,但對(duì)于希望在整個(gè)堆棧中使用一種語言進(jìn)行編程的人來說,這顯示了很大的希望。
Kotlin Native特別有趣,因?yàn)镾wift 看起來與Kotlin非常相似 ,這意味著有朝一日可能會(huì)在Android和iOS應(yīng)用程序中使用相同的本機(jī)代碼庫。
另一個(gè)值得一提的是
Gradle Script Kotlin
,它將靜態(tài)類型的所有好處帶到現(xiàn)有的Gradle DSL和
Spring Boot
,后者為Kotlin提供官方支持
1.5
。
那么Kotlin的缺點(diǎn)是什么?
在Android上,應(yīng)用程序大小是一個(gè)潛在的問題。 Kotlin目前 為您的應(yīng)用程序大小 增加了大約 1Mb, 并使用了大約7,000種方法,盡管其中大部分都可以被 Proguard 剝離 。 對(duì)于傳統(tǒng)的Java桌面應(yīng)用程序來說,這不是什么大不了的事,但對(duì)于擁有更多資源限制的移動(dòng)設(shè)備,這對(duì)某些團(tuán)隊(duì)來說可能是一個(gè)交易破壞者。
Kotlin并沒有和Java一樣長(zhǎng),因此,識(shí)別不良做法和代碼味道要困難得多。 Java有22年的良好實(shí)踐和linting工具可供借鑒,而Kotlin卻沒有。 例如,擴(kuò)展函數(shù)是一個(gè)非常強(qiáng)大的功能,但可以輕松地用于應(yīng)該使用類和抽象的地方。
更人性化的因素是盡管Kotlin與Java非常相似; 學(xué)習(xí)一門新語言總會(huì)有一段時(shí)間,這會(huì)導(dǎo)致生產(chǎn)力暫時(shí)下降。
特別是如果團(tuán)隊(duì)中的每個(gè)人都在過去十年中成為Java專家,他們可能不愿意放棄并以他們不熟悉的語言重新開始。 外部客戶可能對(duì)Kotlin感到不太滿意,因?yàn)橛腥苏J(rèn)為它與Java一樣久不存在,并且更為未知。
為什么Kotlin擊敗Java讓我們總結(jié)一下Kotlin的一些主要優(yōu)點(diǎn):
科特林是 比Java更簡(jiǎn)潔
Lambdas和功能構(gòu)造已經(jīng)開箱即用多年
100%與現(xiàn)有Java代碼的互操作性
Kotlin實(shí)際上消除了最常見的Java錯(cuò)誤之一,可怕的
NullPointerException
IntelliJ IDEA提供出色的工具支持
這種語言是從頭開始編寫的,因此,它 就像是每天都在其中編程的人設(shè)計(jì)的語言
我們認(rèn)為,由于這些原因,Kotlin在Android上擊敗了Java。 在傳統(tǒng)的Java桌面應(yīng)用程序中,由于Java 8包含可比較的語言功能,例如lambda,流和其他,因此它是一個(gè)更接近的競(jìng)爭(zhēng)。 但是,我們?nèi)匀幌嘈臟otlin的簡(jiǎn)潔性在這種情況下獲勝。
關(guān)于Kotlin入門的建議在一篇博客文章中總結(jié)一下編程語言是不可能的,所以如果你或你的團(tuán)隊(duì)有興趣使用Kotlin,我們的建議只是試一試!
最常見的兩條路線是在Kotlin中編寫單元測(cè)試或?qū)F(xiàn)有的Utils類轉(zhuǎn)換為Kotlin。 IntelliJ IDEA還提供了一個(gè)方便的自動(dòng)轉(zhuǎn)換快捷方式,可將現(xiàn)有Java代碼遷移到Kotlin。 雖然這不一定會(huì)給你最慣用的Kotlin,但它是一種在你熟悉的代碼庫中學(xué)習(xí)語法的好方法。
最重要的是不斷評(píng)估每個(gè)人是否對(duì)Kotlin的采用水平感到滿意,并確定任何痛點(diǎn)或隱藏的陷阱。
Kotlin是Java的一個(gè)非常好的替代品,如果做得好,它有可能提高開發(fā)人員的快樂,降低代碼庫的復(fù)雜性,并提高業(yè)務(wù)的生產(chǎn)力。