Kotlin與Java的主客觀對(duì)比分析
Kotlin
Kotlin是一門相對(duì)比較新的JVM語(yǔ)言,JetBrains自2011年以來(lái)一直在積極地開(kāi)發(fā)。
多年來(lái),該語(yǔ)言在Android社區(qū)受到的關(guān)注度越來(lái)越高,并在Google IO 2017大會(huì)之后成為Android開(kāi)發(fā)領(lǐng)域最熱門的話題。這次大會(huì)宣布,Android正式支持Kotlin。
遺憾的是,雖然已經(jīng)有許多關(guān)于Kotlin的文章,但并沒(méi)有多少客觀信息,許多開(kāi)發(fā)人員仍然在苦思冥想,遷移到Kotlin是否是一條正確的道路。
在本文的剩余部分,我將嘗試提供一個(gè)在將Kotlin作為Java的替代項(xiàng)進(jìn)行評(píng)估時(shí)需要考慮的更完善的事項(xiàng)清單。
Kotlin與Java的主觀比較
“Kotlin比Java好”,“Kotlin可讀性比Java強(qiáng)”,“Kotlin開(kāi)發(fā)速度比Java快”,類似這樣的陳述缺少相關(guān)準(zhǔn)確數(shù)據(jù)的支持,所以都?xì)w為主觀看法一類。
主觀看法是個(gè)體開(kāi)發(fā)人員在對(duì)與Kotlin或Java相關(guān)的主題作出一個(gè)或多個(gè)主觀判斷時(shí)形成。
開(kāi)發(fā)人員的主觀判斷存在如下問(wèn)題:
沒(méi)有與主觀判斷相關(guān)聯(lián)的量化指標(biāo)。
主觀判斷存在很大的偏見(jiàn)。
主觀判斷的偏見(jiàn)在開(kāi)發(fā)人員之間存在很大的差異。
由于沒(méi)有與主觀判斷相關(guān)聯(lián)的量化指標(biāo),建立在這些判斷基礎(chǔ)上的觀點(diǎn)只是反映出了開(kāi)發(fā)人員之前就有的偏見(jiàn)。不同的開(kāi)發(fā)人員可能有著截然不同的偏見(jiàn),因此,有開(kāi)發(fā)人員認(rèn)為Kotlin是不錯(cuò)(或糟糕)的Java替代者并不意味著其他開(kāi)發(fā)人員也這么認(rèn)為。
而且,由于沒(méi)有客觀指標(biāo),主觀分歧就無(wú)法客觀地消除,這經(jīng)常會(huì)導(dǎo)致“口水戰(zhàn)”。
主觀判斷的謬誤
為了說(shuō)明主觀判斷可能導(dǎo)致的誤解,讓我們仔細(xì)審視一個(gè)非常常見(jiàn)的主觀看法:
Kotlin可讀性比Java強(qiáng) ——Web上無(wú)數(shù)的文章
理論上講,可以設(shè)法設(shè)計(jì)一個(gè)度量Kotlin和Java之間可讀性差異的實(shí)驗(yàn),但據(jù)我所知,沒(méi)有任何人真正地開(kāi)展這樣一個(gè)實(shí)驗(yàn)。因此,截至目前,這個(gè)看法沒(méi)有任何數(shù)據(jù)支撐。
Kotlin的語(yǔ)法是許多開(kāi)發(fā)人員稱贊其可讀性的一個(gè)原因。他們的邏輯如下:
Kotlin有更好的語(yǔ)法,因此它的可讀性更強(qiáng) ——Web上無(wú)數(shù)的文章
在這句話中,“更好的語(yǔ)法”又是一個(gè)主觀判斷,本身就值得商榷,但為了避免爭(zhēng)論,我們假設(shè)Kotlin的語(yǔ)法確實(shí)更好。但是,這就能說(shuō)明Kotlin的可讀性更強(qiáng)嗎?
為了觀察語(yǔ)法對(duì)可讀性的影響,請(qǐng)閱讀下這段“文本”:
開(kāi)始的時(shí)候,這段“文本”很難理解,但慢慢地,讀起來(lái)會(huì)越來(lái)越容易。如果你再讀個(gè)兩三遍,那么你根本就不會(huì)再注意它是由非標(biāo)準(zhǔn)的字母組成的。準(zhǔn)確地說(shuō),字母的替換不是句法變化,但這確實(shí)可以說(shuō)明,對(duì)于熟練的讀者而言,外觀很少會(huì)成為可讀性的障礙。
我們也可以把這個(gè)例子擴(kuò)展到自然語(yǔ)言。我了解三門截然不同的語(yǔ)言。雖然它們之間差別很大,但我發(fā)現(xiàn),當(dāng)我不理解文本中使用的單詞時(shí),閱讀任何一種語(yǔ)言的文本都非常困難。一旦我認(rèn)識(shí)構(gòu)成文本的單詞并熟悉上下文——無(wú)論它使用了哪一種語(yǔ)言,我讀起來(lái)都不困難。
因此,對(duì)我而言,語(yǔ)言的選擇并不會(huì)影響可讀性,只要理解內(nèi)容和上下文就可以了。
編程語(yǔ)言同樣如此。
當(dāng)我們開(kāi)始使用一門新語(yǔ)言,我們會(huì)有一段時(shí)間很難理解源代碼,需要認(rèn)真領(lǐng)會(huì)每個(gè)句法結(jié)構(gòu)。但是,隨著我們閱讀和編寫特定語(yǔ)言的代碼越來(lái)越多,我們逐漸就熟悉了那門語(yǔ)言的語(yǔ)法,到某個(gè)時(shí)候,我們就不會(huì)再注意句法結(jié)構(gòu)了。
我自己在多門語(yǔ)言上有過(guò)這種體驗(yàn):Verilog、Bash、Perl、Tcl、Lisp、Java。
根據(jù)我使用上述語(yǔ)言的經(jīng)驗(yàn),我可以告訴你:如果一個(gè)人適應(yīng)了Lisp的代碼,并且不會(huì)再注意到小括號(hào),那么跟Java比起來(lái),Kotlin的語(yǔ)法完全不能對(duì)可讀性產(chǎn)生不可忽視的影響,即使它“更好”。
既然我們?cè)谟懻撨@個(gè)話題,我就分享下自己對(duì)于影響源代碼可讀性因素的主觀判斷。
在讀過(guò)其他開(kāi)發(fā)人員使用許多語(yǔ)言編寫的代碼后(上面只羅列了我在某個(gè)階段精通的語(yǔ)言;我用過(guò)的所有語(yǔ)言比這個(gè)多),我得出如下結(jié)論:如果開(kāi)發(fā)人員使用某一門語(yǔ)言可以編寫出可讀性和可理解性都很好的代碼,那么他們通常也可以使用其他語(yǔ)言編寫出可讀性和可理解性都很好的代碼。
因此,我根據(jù)自己的經(jīng)驗(yàn)作出的主觀判斷是,源代碼的可讀性和選擇的語(yǔ)言無(wú)關(guān),那取決于代碼編寫者的技能和讀者的技能(編寫者的技能更重要)。
如果你仍然認(rèn)為主觀看法具有代表性,那么至少閱讀并思考下Robert “Uncle Bob” Martin在這篇博文中的觀點(diǎn)。
Kotlin與Java的客觀比較
與主觀比較相反,客觀比較使用量化指標(biāo)來(lái)度量或評(píng)估Kotlin比Java有優(yōu)勢(shì)的地方。
用一套標(biāo)準(zhǔn)客觀地證明一門編程語(yǔ)言是否強(qiáng)過(guò)另一門,這種想法非常有吸引力,但是有個(gè)問(wèn)題:據(jù)我所知,沒(méi)有與編程語(yǔ)言相關(guān)的通用客觀指標(biāo)。
考慮到我們無(wú)法進(jìn)行精確的直接比較,那我們能否客觀地比較Kotlin和Java呢?能!我們?nèi)匀荒茉u(píng)估從Java切換到Kotlin所帶來(lái)的積極和消息影響的程度,然后比較結(jié)果,并討論它們的影響。
為了評(píng)估Kotlin所能帶來(lái)的最好結(jié)果,我們將做如下假設(shè):
開(kāi)發(fā)人員可以立即切換到Kotlin;
切換到Kotlin后,開(kāi)發(fā)人員不會(huì)損失任何技能(例如,有兩年Java開(kāi)發(fā)經(jīng)驗(yàn)的開(kāi)發(fā)人員可以神奇地獲得兩年的Kotlin開(kāi)發(fā)經(jīng)驗(yàn));
Kotlin和Java一樣穩(wěn)定;
Kotlin工具和Java工具一樣成熟。
事實(shí)上,上述假設(shè)沒(méi)有一個(gè)是合理的,但在開(kāi)始的時(shí)候,有一個(gè)理想化的設(shè)定便于說(shuō)明。然后,我們會(huì)拋開(kāi)這些假設(shè),討論真實(shí)世界的效應(yīng)所帶來(lái)的影響。
Kotlin最佳結(jié)果估計(jì)
遵循Steve McConnell在Code Complete一書中提出的模式,我們可以將軟件構(gòu)建活動(dòng)分解成三個(gè)子活動(dòng):詳細(xì)設(shè)計(jì)、編碼與調(diào)試、開(kāi)發(fā)測(cè)試。
Kotlin對(duì)于詳細(xì)設(shè)計(jì)子活動(dòng)沒(méi)什么影響(這項(xiàng)活動(dòng)通常獨(dú)立于選用的特定的面向?qū)ο缶幊陶Z(yǔ)言),因此,在這一部分,Kotlin和Java需要付出同樣的努力。
據(jù)我所知,對(duì)于開(kāi)發(fā)測(cè)試子活動(dòng),Kotlin也沒(méi)有提出什么革命性的東西。因此,開(kāi)發(fā)測(cè)試需要付出的努力也一樣。
就剩編碼與調(diào)試子活動(dòng)了。
如果我們用Kotlin替換Java,那么我在編碼與調(diào)試活動(dòng)中可以節(jié)省多少工作量?這個(gè)問(wèn)題很難回答,不同程序員之間這一數(shù)值會(huì)有很大差異(有些程序員使用Java更高效)。不過(guò),既然我們?cè)谠u(píng)估最好的情況,我們不妨假設(shè)從Java切換到Kotlin可以將開(kāi)發(fā)人員在編碼與調(diào)試階段的生產(chǎn)力平均提高10%。
10%的生產(chǎn)力提升是一個(gè)不現(xiàn)實(shí)到令人吃驚的數(shù)值。即使我們?cè)谖谋揪庉嬈髦惺止ぽ斎胨写a,那也是不現(xiàn)實(shí)的??紤]到現(xiàn)如今IDE的功能,這一數(shù)值更是不現(xiàn)實(shí)。考慮到有些開(kāi)發(fā)人員使用Java更高效,這個(gè)數(shù)值就毫無(wú)道理了。
我不介意使用這樣一個(gè)既不現(xiàn)實(shí)又對(duì)Kotlin評(píng)估有利的數(shù)值,因?yàn)槲抑?,不管它?duì)評(píng)估結(jié)果產(chǎn)生了怎樣不切實(shí)際的積極影響,一旦我們拋開(kāi)其中部分“理想的假設(shè)”,由此帶來(lái)的負(fù)面影響會(huì)抵消掉那些積極影響。
那么,在編碼與調(diào)試方面提升了10%——我們把產(chǎn)品交付給客戶的速度快了多少?
下面這張圖片來(lái)自Code Complete一書,展示了軟件項(xiàng)目的各種活動(dòng)所占的比例:
圖 小項(xiàng)目以構(gòu)建活動(dòng)為主。大點(diǎn)的項(xiàng)目需要更多架構(gòu)、集成和系統(tǒng)測(cè)試工作來(lái)保證項(xiàng)目成功。這張圖沒(méi)有顯示需求,因?yàn)楹推渌顒?dòng)不一樣,需求工作不是直接的程序功能。(Albrecht 1979; Glass 1982; Boehm, Gray, and Seewaldt 1984; Boddie 1987; Card 1987; McGarry, Waligora, and McDermott 1989; Brooks 1995; Jones 1998; Jones 2000; Boehm et al. 2000)
Code Complete,第二版
根據(jù)來(lái)自Code Complete的這張圖片,在一個(gè)較大的軟件項(xiàng)目中(多于10K行),編碼和調(diào)試只占項(xiàng)目總工作量的不足20%。
因此,在一個(gè)較大的軟件項(xiàng)目中,我們所假設(shè)的編碼和調(diào)試效率提升10%,只能將完成項(xiàng)目所需的總工作量縮減2%。
例如,一個(gè)需要5人年才可以完成的項(xiàng)目(這是相對(duì)比較大的Android項(xiàng)目),總工作量的2%為:
5人-年 * 12 * 4 * 5 * 0.02 = 24(人-天)
如果我們真得能夠把項(xiàng)目工作量減少24人-天,這會(huì)是一個(gè)從Java切換到Kotlin的很好的理由。然而,我們應(yīng)該還記得,上述積極評(píng)估是在理想情況下得出的,其基礎(chǔ)是不切實(shí)際的假設(shè)。
在真實(shí)世界里,切換到另外一門編程語(yǔ)言會(huì)產(chǎn)生不可避免的影響,我們將評(píng)估這種影響,并與上述理想化評(píng)估作個(gè)比較。
開(kāi)發(fā)人員準(zhǔn)備
為了評(píng)估最好的情況,我們假設(shè)開(kāi)發(fā)人員可以立即從Java切換到Kotlin。
實(shí)際上,雖然Kotlin和Java非常類似,但開(kāi)發(fā)人員仍然需要花一些時(shí)間來(lái)學(xué)習(xí),然后再花一些時(shí)間來(lái)調(diào)整開(kāi)發(fā)實(shí)踐和工具。準(zhǔn)備時(shí)間因人而異:有些開(kāi)發(fā)人員可以三四天完成切換,其他人則需要10天甚至更多的時(shí)間。
讓我們樂(lè)觀一點(diǎn),平均每個(gè)開(kāi)發(fā)人員只要5天就可以從Java切換到Kotlin。
一個(gè)需要5人年才能完成的項(xiàng)目會(huì)有3到5名開(kāi)發(fā)人員(最好的情況下)。平均每個(gè)開(kāi)發(fā)人員的切換時(shí)間為5天,這樣,一個(gè)項(xiàng)目總計(jì)就需要15到25個(gè)人天的切換時(shí)間。
切換到Kotlin所節(jié)省的工作量(樂(lè)觀估計(jì))與切換所需的總工作量似乎差不多。
開(kāi)發(fā)人員技能損失
使用一門特定的編程語(yǔ)言高效工作的能力是一項(xiàng)技能。
我們已經(jīng)討論了這項(xiàng)技能的其中一個(gè)方面(代碼可讀性),但還有許多其他方面。當(dāng)從一門語(yǔ)言切換到另一門時(shí),與舊編程語(yǔ)言相關(guān)的部分技能可以運(yùn)用到新語(yǔ)言上,但該技能的其他部分會(huì)損失掉。
為了評(píng)估編程語(yǔ)言技能損失對(duì)項(xiàng)目工作量的影響,我們將使用源自Cocomo2評(píng)估模型的“語(yǔ)言與工具體驗(yàn)”因子:
語(yǔ)言與工具經(jīng)驗(yàn)(LTEX)
該指標(biāo)用于衡量開(kāi)發(fā)軟件系統(tǒng)或子系統(tǒng)的項(xiàng)目團(tuán)隊(duì)使用編程語(yǔ)言和軟件工具的經(jīng)驗(yàn)。軟件開(kāi)發(fā)包括借助工具完成需求、表現(xiàn)形式設(shè)計(jì)與分析、配置管理、文檔提取、庫(kù)管理、程序樣式與格式化、一致性檢查、計(jì)劃與控制等等。除了項(xiàng)目編程語(yǔ)言經(jīng)驗(yàn)外,項(xiàng)目支持工具集的經(jīng)驗(yàn)也會(huì)影響開(kāi)發(fā)工作。經(jīng)驗(yàn)低于2個(gè)月會(huì)獲得一個(gè)很低的評(píng)級(jí),有6個(gè)月或多年的經(jīng)驗(yàn)則會(huì)獲得一個(gè)很高的評(píng)級(jí),見(jiàn)下表:
我不知道這是什么樣的衰退,有多少項(xiàng)目受到了影響,但我的大腦自動(dòng)將“重大性能衰退”這個(gè)搭配翻譯成了“浪費(fèi)了許多小時(shí)的開(kāi)發(fā)時(shí)間?!?/p>
此外,如果你讀一遍發(fā)布說(shuō)明的評(píng)論,你就會(huì)注意到,許多人遇到了遷移問(wèn)題。在1.1.2版本的評(píng)論里,甚至有人指出,這個(gè)“補(bǔ)丁”發(fā)布引入了破壞性(向后不兼容)的修改。
相比之下,如果你讀一遍Oracle JDK8的發(fā)布說(shuō)明,你就會(huì)發(fā)現(xiàn),它比較穩(wěn)定。大多數(shù)修改都是安全改進(jìn)方面的。
因此,與Java相比,Kotlin是一門不穩(wěn)定且不成熟的語(yǔ)言——遷移到Kotlin會(huì)對(duì)項(xiàng)目產(chǎn)生怎樣的影響?為了回答這個(gè)問(wèn)題,我將使用來(lái)自Cocomo 2評(píng)估模型的“平臺(tái)波動(dòng)性”工作因子:
平臺(tái)波動(dòng)性(PVOL) 這里使用“平臺(tái)”一詞指代軟件產(chǎn)品執(zhí)行任務(wù)時(shí)調(diào)用的復(fù)雜硬件和軟件(OS、DBMS等)。如果開(kāi)發(fā)的軟件是一個(gè)操作系統(tǒng),那么平臺(tái)就是計(jì)算機(jī)硬件。如果開(kāi)發(fā)的是數(shù)據(jù)庫(kù)管理系統(tǒng),那么平臺(tái)就是硬件和操作系統(tǒng)。如果開(kāi)發(fā)的是網(wǎng)絡(luò)文本瀏覽器,那么平臺(tái)就是網(wǎng)絡(luò)、計(jì)算機(jī)硬件、操作系統(tǒng)和分布式信息庫(kù)。平臺(tái)包括支撐軟件系統(tǒng)開(kāi)發(fā)所需的編譯器或裝配器。如下表所示,如果平臺(tái)每12個(gè)月才有一次重大變更,則評(píng)級(jí)就會(huì)很低,如果每2周有一次重大變更,則評(píng)級(jí)就會(huì)很高:
Cocomo2模型定義手冊(cè)
你可能已經(jīng)注意到,編程語(yǔ)言并沒(méi)有直接出現(xiàn)在該工作因子的描述里,但出現(xiàn)了編譯器和裝配器。在我看來(lái),這段描述沒(méi)有顯式包含編程語(yǔ)言,是因?yàn)榈贸鯟ocomo2模型的所有項(xiàng)目都使用了穩(wěn)定的語(yǔ)言。
由于編譯器和裝配器屬于這個(gè)工作因子,所以我們也可以推斷出編程語(yǔ)言及相關(guān)工具。
根據(jù)平臺(tái)波動(dòng)性的這種評(píng)級(jí)范圍,Java的評(píng)級(jí)應(yīng)該是“verylow”,而Kotlin的評(píng)級(jí)應(yīng)該是“l(fā)ow”或更高。Kotlin的評(píng)級(jí)可能會(huì)更高,因?yàn)樗鼉?nèi)部依賴于其它工具,增加了出現(xiàn)兼容性問(wèn)題的風(fēng)險(xiǎn)。
由于“verylow”沒(méi)有提供工作因子,所以我們需要估計(jì)。
看下該因子從“veryhigh”到“l(fā)ow”的評(píng)分遞減規(guī)律,我認(rèn)為,我們可以放心的假設(shè),“verylow”的評(píng)分不高于0.82。
基于這些假設(shè)(有利于Kotlin),如果一個(gè)項(xiàng)目需要5人年的額定工作量,那么使用Kotlin,工作量就變成了1044人天,而使用Java的總工作量是984人天。
選擇使用Kotlin而不是Java實(shí)現(xiàn)這樣一個(gè)項(xiàng)目會(huì)使總工作量增加60人天。
語(yǔ)言和工具不穩(wěn)定所導(dǎo)致的額外工作是切換到Kotlin所縮減的工作的2倍多。
綜合所有因素
我當(dāng)成例子來(lái)討論的項(xiàng)目需要5人年的額定工作量。
根據(jù)上述評(píng)估,如果該項(xiàng)目由平均具備1年Java開(kāi)發(fā)經(jīng)驗(yàn)的開(kāi)發(fā)人員使用Java實(shí)現(xiàn),則總工作量為:
5人-年*LTEX(Java)*PVOL(Java)=984(人-天)
如果同樣的項(xiàng)目由幾乎沒(méi)有Kotlin開(kāi)發(fā)經(jīng)驗(yàn)的開(kāi)發(fā)人員使用Kotlin實(shí)現(xiàn),則總工作量為:
5人-年*LTEX(Kotlin)*PVOL(Kotlin)*0.98+T_ramp_up=1115+5*N_developers(人-天)
據(jù)估計(jì),選擇Kotlin替換Java所導(dǎo)致的額外工作量為131+5*N_developers(人-天)。
評(píng)估注意事項(xiàng)
在評(píng)估討論的過(guò)程中,我們得出了與Kotlin和Java相關(guān)的、便利的工作量單點(diǎn)值。
但實(shí)際上,單點(diǎn)值根本不是估計(jì)——它們只是猜測(cè)。真正的估計(jì)必須有一個(gè)相關(guān)聯(lián)的不確定性。換句話說(shuō),估計(jì)表示可能性的范圍,而不是單點(diǎn)值。
我們最終使用單點(diǎn)值代替了范圍,那是因?yàn)槲覐墓浪惴秶镞x擇了最有利于Kotlin的值,將所有的估計(jì)都轉(zhuǎn)換成了單點(diǎn)值。
例如,當(dāng)討論Kotlin對(duì)編碼與調(diào)試活動(dòng)的影響時(shí),我從估計(jì)出的可能性范圍[-5%,10%]中選擇了最大的生產(chǎn)力提升值10%。在其他情況下,當(dāng)我們討論開(kāi)發(fā)人員切換到Kotlin的平均時(shí)間時(shí),我從估計(jì)的可能性范圍[5天,21天]中選擇了最小的5天。
此外,我們使用了Cocomo2估計(jì)模型專用的工作因子。這些因子并不是放之四海而皆準(zhǔn)的真理,在最一般的情況下,應(yīng)該也有相關(guān)聯(lián)的不確定性。我賦給Kotlin的評(píng)級(jí)高于我實(shí)際上認(rèn)為它應(yīng)得的評(píng)級(jí),我希望通過(guò)這種方式消除這種不確定性。
不用說(shuō),我們獲得的單點(diǎn)值并不是百分百正確。為了得出更完整的估計(jì),我們可以利用真正的估計(jì)進(jìn)行MonteCarlo仿真。通過(guò)這項(xiàng)技術(shù),我們可以觀察可能結(jié)果的分布,弄清楚哪種結(jié)果最可能出現(xiàn)。
請(qǐng)記住,由于我們將估計(jì)壓縮成了對(duì)Kotlin而言最為有利的單點(diǎn)值,所以其他可能的結(jié)果會(huì)顯示出更大的Kotlin切換開(kāi)銷。因此,在所有可能的結(jié)果中,我們?cè)谏衔拿枋龅膯吸c(diǎn)值是最有利于Kotlin的。
小結(jié)
在文章開(kāi)頭部分,我們展示了一些可能會(huì)對(duì)開(kāi)發(fā)人員比較編程語(yǔ)言造成誤導(dǎo)的主觀判斷。
接下來(lái),我們討論了客觀比較編程語(yǔ)言存在的困難,并進(jìn)行了一系列的估計(jì),以便弄清楚Kotlin棧與Java棧完成軟件項(xiàng)目所需的總工作量。在執(zhí)行估計(jì)時(shí),我們一直使用估計(jì)范圍里最有利于Kotlin的值。
通過(guò)我們的分析,從Java切換到Kotlin似乎會(huì)導(dǎo)致完成軟件項(xiàng)目所需的總工作量增加。
更多的工作意味著企業(yè)切換到Kotlin需要花更多的錢才能獲得同樣的功能,而用戶需要等待更長(zhǎng)的時(shí)間才能獲得產(chǎn)品。
有些開(kāi)發(fā)人員可能會(huì)吃驚,覺(jué)得這個(gè)結(jié)果不容易接受。
在考慮了所有的情況之后,谷歌最終決定支持KotlinAnroid開(kāi)發(fā)。對(duì)此,谷歌可能需要相當(dāng)大的投入——谷歌云平臺(tái)團(tuán)隊(duì)是不是沒(méi)有人可以做類似的分析,從而弄清楚切換到一門新語(yǔ)言所帶來(lái)的負(fù)面影響?
我認(rèn)為,谷歌員工都是非常聰明的人,我相信他們?cè)跊Q定支持Kotlin之前已經(jīng)進(jìn)行了非常深入的分析。
以上就是本文關(guān)于Kotlin與Java的主客觀對(duì)比分析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出!
相關(guān)文章
Java運(yùn)行時(shí)jar終端輸出的中文日志亂碼兩種解決方式
jar包啟動(dòng),今天java開(kāi)發(fā)過(guò)來(lái)找,說(shuō)jar包啟動(dòng)日志是亂碼,這篇文章主要給大家介紹了關(guān)于Java運(yùn)行時(shí)jar終端輸出的中文日志亂碼的兩種解決方式,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01Springboot基礎(chǔ)學(xué)習(xí)之初識(shí)SpringBoot
今天帶大家學(xué)習(xí)Springboot基礎(chǔ)知識(shí),文中有非常詳細(xì)的圖文解說(shuō)及代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05如何通過(guò)Maven倉(cāng)庫(kù)安裝Spire系列的Java產(chǎn)品
這篇文章主要介紹了如何通過(guò)Maven倉(cāng)庫(kù)安裝Spire系列的Java產(chǎn)品,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Java實(shí)現(xiàn)Socket的TCP傳輸實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)Socket的TCP傳輸,實(shí)例分析了java通過(guò)socket實(shí)現(xiàn)TCP傳輸?shù)南嚓P(guān)技巧,需要的朋友可以參考下2015-05-05Linux下Java Python啟動(dòng)管理腳本方便程序管理
這篇文章主要為大家介紹了Linux下Java/Python啟動(dòng)管理腳本方便程序管理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11