到底該用Kotlin開(kāi)發(fā)Android應(yīng)用,還是用Java?
譯文【51CTO.com快譯】還記得多年前有關(guān)Android與iOS孰優(yōu)孰劣的辯論嗎?如今,Kotlin與Java的爭(zhēng)論,時(shí)常廣泛地發(fā)生在開(kāi)發(fā)人員之中。不過(guò),由于大家往往關(guān)注的是Java所不具備的Kotlin功能,因此他們的結(jié)論可能略顯偏頗。下面,我將從資深應(yīng)用開(kāi)發(fā)人員的角度,綜合比較Kotlin與Java在不同領(lǐng)域的優(yōu)缺點(diǎn),以方便您做出判斷和選擇。
首先,我們來(lái)簡(jiǎn)單了解一下這兩種語(yǔ)言。
Kotlin:簡(jiǎn)介
由JetBrain推出的Kotlin,旨在提高Java的生產(chǎn)率。它是一種靜態(tài)類型的語(yǔ)言,可用于JavaScript,以及Java虛擬機(jī)(JVM)中。由于Google在2019年宣布將其選為首選開(kāi)發(fā)語(yǔ)言,因此Kotlin的流行度得以大幅提升。
使用Kotlin開(kāi)發(fā)的流行應(yīng)用包括:
- Trello
- Evernote
- Coursera
- Uber
目前,有許多行業(yè)巨頭企業(yè)正在考慮從Java或其他語(yǔ)言遷移到Kotlin。
Kotlin的常見(jiàn)問(wèn)題與解答
相比Java,Kotlin是一種較新的語(yǔ)言,因此許多初學(xué)者(甚至一些專業(yè)開(kāi)發(fā)人員)經(jīng)常圍繞著它,提出各種問(wèn)題。下面便是一些常見(jiàn)的問(wèn)題與解答。
我應(yīng)該在上手Kotlin之前學(xué)習(xí)Java嗎?
如果您是一位經(jīng)驗(yàn)豐富的開(kāi)發(fā)人員,并且掌握著與移動(dòng)應(yīng)用開(kāi)發(fā)相關(guān)的基礎(chǔ)知識(shí),那么您可能無(wú)需成為Java專家,便可以開(kāi)始學(xué)習(xí)Kotlin。但是,如果您不太熟悉移動(dòng)應(yīng)用的開(kāi)發(fā),那么在上手Kotlin之前,最好通過(guò)學(xué)習(xí)Java來(lái)打下基礎(chǔ)。
我可以使用Kotlin進(jìn)行Web開(kāi)發(fā)嗎?
Kotlin是一個(gè)全棧式的解決方案,因此它也可以被用于Web開(kāi)發(fā)。在服務(wù)器上,您不但可以將Kotlin用在前端,也可以在后端使用它。
Kotlin和Java是否一回事?
Kotlin和Java在某些方面的確有著相似之處,但它們?cè)谒俣群托阅芊矫娼厝徊煌?/p>
Java:簡(jiǎn)介
Java是由Sun Microsystems(后被Oracle收購(gòu)了)于1995年發(fā)布的,一種面向?qū)ο蟮木幊陶Z(yǔ)言。目前,大部分Android應(yīng)用,以及Android系統(tǒng)本身都是基于Java的。這正是其成為所有Android應(yīng)用開(kāi)發(fā)人員優(yōu)先選擇的原因。此外,由于Java的大多數(shù)元素都是開(kāi)源的,因此,它很容易被用來(lái)進(jìn)行程序開(kāi)發(fā)。
使用Java開(kāi)發(fā)的流行應(yīng)用包括:
- Spotify
- NASA WorldWind
- Signal
- CashApp
- Minecraft
下面,讓我們基于各項(xiàng)功能特性,來(lái)了解Kotlin和Java之間的區(qū)別。
編寫代碼的速度
Kotlin的主要優(yōu)勢(shì)之一在于簡(jiǎn)潔。在與Java同等實(shí)現(xiàn)最終目標(biāo)的前提下,您可以用Kotlin更快地編寫出更少量的代碼,進(jìn)而快速完成任務(wù)。
不過(guò),在使用Kotlin時(shí),您可能需要花費(fèi)更多的時(shí)間,去全面考慮解決方案。而使用Java則不需花費(fèi)過(guò)多的時(shí)間去準(zhǔn)備方案。因此,您需要自行判斷,到底是要節(jié)省“磨刀功”、還是“砍柴功”了。
性能與功能
由于兩種語(yǔ)言都可以編譯出能夠在JVM上運(yùn)行的字節(jié)碼(ByteCode),因此我們無(wú)法直接比較它們的內(nèi)存使用情況。下面,讓我們來(lái)看看Kotlin與Java在性能與功能上的不同:
- Java提供了異常檢查的功能,Kotlin則不然。
- Kotlin具有協(xié)程(Coroutines,可以幫助編寫異步代碼),Java則沒(méi)有。
- Kotlin提供了擴(kuò)展功能。
- Kotlin內(nèi)置了高階函數(shù)(Higher-order functions)和Lambda,因此開(kāi)發(fā)者不必去處理Retrolambdas插件。在Java中,您將必須通過(guò)可調(diào)用函數(shù),來(lái)實(shí)現(xiàn)高階函數(shù)。同時(shí),Java在其第8版本中引入了Lambda。
- Kotlin為委派提供了原生支持,并具有內(nèi)聯(lián)函數(shù)(inline functions)。
- Java具有非私有字段(non-private fields)和NullPointerExceptions,Kotlin則不然。
- Kotlin沒(méi)有像Java那樣的靜態(tài)成員,但是它提供了替代對(duì)象。
- Kotlin具有null safe特性。
- Kotlin具有smart casts,Java則沒(méi)有。
總體而言,Kotlin雖然不及Java功能豐富,但是它在開(kāi)發(fā)Android應(yīng)用性能方面比較占優(yōu)。
穩(wěn)定性
由于相對(duì)較新,因此Kotlin沒(méi)有長(zhǎng)期支持的版本。而Java有著Java 8和Java 11之類的長(zhǎng)期支持版本。這就意味著,如果這些版本出現(xiàn)了問(wèn)題,其原始開(kāi)發(fā)者將會(huì)使用補(bǔ)丁程序,對(duì)其進(jìn)行修復(fù)。
可見(jiàn),Java在穩(wěn)定性上勝出。當(dāng)然,Kotlin并不能因此被稱為不穩(wěn)定的編程語(yǔ)言。
文檔資料
Oracle提供了充足的Java官方文檔,可供您學(xué)習(xí)與研究。此外,由于有著長(zhǎng)時(shí)間的積累,您可以很容易地找到Java的相關(guān)教程、書籍和指南。
作為相對(duì)年輕的語(yǔ)言,Kotlin當(dāng)然也有著不錯(cuò)的官方文檔。不過(guò),您需要通過(guò)深挖,才能找到更多的資源。
社區(qū)
作為一種古老的語(yǔ)言,Java比Kotlin擁有更廣泛的開(kāi)發(fā)者社區(qū)。不過(guò)有調(diào)查表明(https://insights.stackoverflow.com/survey/2020#top-paying-technologies),業(yè)界有62.9%的開(kāi)發(fā)者喜歡Kotlin,而只有44.1%的開(kāi)發(fā)者表示他們喜歡Java。
因此,您可以放心地使用這兩種語(yǔ)言。如果碰到任何與語(yǔ)言有關(guān)的問(wèn)題,您都可以從各個(gè)的社區(qū),快速地獲得在線支持與解決方案。
易于學(xué)習(xí)
由于Kotlin比Java更需要編程基礎(chǔ),因此Java更易于學(xué)習(xí)和實(shí)現(xiàn)。當(dāng)然,如果您更善于抽象思想,那么學(xué)習(xí)Kotlin就不是什么問(wèn)題了。
編譯速度
有測(cè)試表明:在使用Gradle(譯者注:是一個(gè)基于Apache Ant和Apache Maven概念的,項(xiàng)目自動(dòng)化構(gòu)建開(kāi)源工具)守護(hù)程序進(jìn)行純凈(clean)構(gòu)建時(shí),Java的編譯速度比Kotlin快17%;而隨著Gradle守護(hù)進(jìn)程的持續(xù)運(yùn)行,Java最終的編譯速度比Kotlin快13%。
當(dāng)然,純凈構(gòu)建在真實(shí)編碼實(shí)踐中極其少見(jiàn),大多數(shù)開(kāi)發(fā)人員都會(huì)用到增量(incremental)構(gòu)建。下面是在對(duì)Gradle守護(hù)程序進(jìn)行了兩至三次持續(xù)運(yùn)行后,不同類型的增量構(gòu)建在編譯速度上的比較結(jié)果:
- 不作任何更改 - Java(4.6秒),Kotlin(4.5秒)。
- 更改某個(gè)未被其他用戶使用的文件 - Java(7秒),Kotlin(6.1秒)。
- 更改項(xiàng)目中由其他文件導(dǎo)入的文件 - Java(7.1秒),Kotlin(6秒)。
由上述結(jié)果可知,Java的純凈構(gòu)建速度更快;而Kotlin在增量構(gòu)建時(shí)更快。
小結(jié)
綜合上述比較,我們不難看出:對(duì)于資深Java程序員而言,從自己熟悉的語(yǔ)言切換到另一種新的語(yǔ)言,其意義不大。而對(duì)于初學(xué)者而言,Kotlin的學(xué)習(xí)曲線則更為陡峭。當(dāng)然,Kotlin的如下兩個(gè)主要優(yōu)勢(shì),可能會(huì)成為企業(yè)在項(xiàng)目中使用它的驅(qū)動(dòng)原因:
- Kotlin能夠大幅減少應(yīng)用開(kāi)發(fā)的用時(shí)。
- Kotlin可以減少應(yīng)用崩潰的可能性。
基于Kotlin的上述優(yōu)勢(shì),如果企業(yè)需要在Android開(kāi)發(fā)領(lǐng)域保持競(jìng)爭(zhēng)優(yōu)勢(shì)的話,就會(huì)趨向選擇Kotlin,而不是Java。那么企業(yè)內(nèi)部的開(kāi)發(fā)人員也就會(huì)順應(yīng)此趨勢(shì),開(kāi)始學(xué)習(xí)Kotlin,這種面向未來(lái)的語(yǔ)言。
原文標(biāo)題:Kotlin vs. Java in Android App Development,作者: Anand Mahajan
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】