- Java到Kotlin:代碼重構(gòu)指南
- (英)鄧肯·麥格雷戈 (英)納特·普萊斯
- 1506字
- 2025-01-03 16:16:35
2.2 在Java構(gòu)建中添加對(duì)Kotlin的支持
如果我們想把Java項(xiàng)目重構(gòu)為Kotlin項(xiàng)目,第一個(gè)必須做出的改變就是讓自己有能力在代碼庫(kù)中編寫Kotlin代碼。令人高興的是,Kotlin的構(gòu)建工具和IDE讓這一切變得非常簡(jiǎn)單。在我們的Gradle構(gòu)建配置中,只需增加幾行,就可以讓Kotlin和Java一樣進(jìn)行編譯。當(dāng)我們重新同步構(gòu)建文件時(shí),IntelliJ就會(huì)接收該配置,讓我們幾乎能夠無(wú)縫地在兩種語(yǔ)言之間進(jìn)行導(dǎo)航、自動(dòng)完成代碼和重構(gòu)。
要將Kotlin添加到Gradle構(gòu)建中,需要添加Kotlin插件。Kotlin所支持的每一類編譯目標(biāo)(JVM、JavaScript和本地代碼)都有不同的插件以及用于構(gòu)建多平臺(tái)項(xiàng)目的插件。因?yàn)槲覀円瓿傻氖荍ava項(xiàng)目,所以先忽略其他平臺(tái),使用Kotlin的JVM插件。
我們還需要將Kotlin標(biāo)準(zhǔn)庫(kù)添加到依賴項(xiàng)中,并指定輸出字節(jié)碼所支持的最小JVM版本。我們的項(xiàng)目以JDK 11為目標(biāo)(在撰寫本書時(shí),它是最新的LTS版本)。在撰寫本書時(shí),Kotlin編譯器可以生成與JDK 1.6或JDK 1.8兼容的字節(jié)碼。JDK 1.8的字節(jié)碼效率更高,在JDK 11上運(yùn)行良好,所以我們將選擇它。
Kotlin版本
Kotlin語(yǔ)言和標(biāo)準(zhǔn)庫(kù)仍在不斷完善,但JetBrains的策略是提供一個(gè)清晰的遷移路徑。我們開(kāi)始撰寫本書時(shí),Kotlin的版本是1.3;我們完成本書的時(shí)候,1.5版本剛剛發(fā)布,示例代碼中使用的一些標(biāo)準(zhǔn)API已經(jīng)被廢除了,我們沒(méi)有將它們遷移到其替代品上,這樣代碼就能在Kotlin 1.4和Kotlin 1.5上運(yùn)行了。
以下是修改前的build.gradle的相關(guān)部分:

在添加了Kotlin插件后,構(gòu)建文件看起來(lái)像下面這樣:

鑒于這些變化,我們重新運(yùn)行構(gòu)建文件,可以看到構(gòu)建仍然有效!
如果在IntelliJ中重新同步Gradle項(xiàng)目(這可能在保存時(shí)自動(dòng)發(fā)生),我們可以在IDE中運(yùn)行測(cè)試和程序。
測(cè)試仍然可以通過(guò),所以我們沒(méi)有破壞任何東西,但也無(wú)法證明我們可以在項(xiàng)目中使用Kotlin。我們通過(guò)編寫一個(gè)“hello world”程序來(lái)測(cè)試一下。在Java源代碼樹(shù)的根級(jí)包src/main/java中創(chuàng)建一個(gè)文件HelloWorld.kt:

在何處放置Kotlin代碼
Kotlin構(gòu)建插件增加了額外的源代碼根目錄,即src/main/kotlin和src/test/kotlin,并編譯其所有子目錄中發(fā)現(xiàn)的Kotlin源代碼文件。
它也會(huì)編譯在Java源代碼樹(shù)中發(fā)現(xiàn)的Kotlin源代碼,特別是src/main/java和src/test/java。雖然你可以按語(yǔ)言來(lái)分離源文件,把Java文件放在java目錄下,把Kotlin文件放在kotlin目錄下,但實(shí)際上我們并不反感將Java文件和Kotlin文件放在一起。能夠在一個(gè)目錄中看到相應(yīng)包的所有源代碼也挺好,不用在文件系統(tǒng)中四處尋找。不過(guò),為了做到這一點(diǎn),我們把Kotlin的源代碼放在反映包結(jié)構(gòu)的目錄中,而不是利用Kotlin的能力,將映射到不同包的多個(gè)文件放在單個(gè)目錄下。
同樣,雖然Kotlin允許在一個(gè)類中定義多個(gè)公共類,但當(dāng)我們?cè)谝粋€(gè)項(xiàng)目中混用Java和Kotlin時(shí),為了保持一致性,我們傾向于堅(jiān)持每個(gè)Kotlin文件只包含一個(gè)類。
可以通過(guò)在IDE中單擊fun main()函數(shù)左邊的綠色箭頭來(lái)啟動(dòng)程序。
我們也可以通過(guò)java命令行來(lái)執(zhí)行構(gòu)建文件并啟動(dòng)程序。編譯名為HelloWorld.kt的源文件會(huì)創(chuàng)建一個(gè)名為HelloWorldKt的Java類文件。我們將在后面詳細(xì)研究Kotlin源代碼如何被翻譯成Java類文件,但現(xiàn)在,我們可以用java命令來(lái)運(yùn)行程序,就像下面這樣:

成功了!
我們刪除HelloWorld.kt——它的使命已經(jīng)完成了——提交并推送。
現(xiàn)在,我們可以選擇在項(xiàng)目中使用Kotlin了,本章前面已經(jīng)給出了一些關(guān)于從哪里起步的指南。
其他構(gòu)建系統(tǒng)
我們已經(jīng)展示了在Gradle構(gòu)建中添加Kotlin支持所需的改動(dòng),但你也可以按照Kotlin文檔(https://oreil.ly/bWi9n)工具部分提供的說(shuō)明,使用Maven或Ant。文檔中也給出了如何使用命令行編譯器kotlinc的說(shuō)明。
如果你用的是Gradle,也可以選擇使用Kotlin作為構(gòu)建定義語(yǔ)言,而不是傳統(tǒng)的Groovy。這樣做的好處是借助強(qiáng)類型提供更好的工具支持,但代價(jià)是必須將StackOverflow中的歷史回答翻譯成一種新的語(yǔ)言。
由于我們是Java和Kotlin開(kāi)發(fā)者,而不是Java和Groovy開(kāi)發(fā)者,因此選擇用Kotlin DSL來(lái)啟動(dòng)新項(xiàng)目,但我們覺(jué)得沒(méi)有必要將現(xiàn)有的Groovy構(gòu)建轉(zhuǎn)換為Kotlin,至少不需要立即轉(zhuǎn)換。就像生產(chǎn)代碼中的Java和Kotlin一樣,我們可以在構(gòu)建中混合使用Kotlin和Groovy,所以這是一個(gè)可以慢慢進(jìn)行的轉(zhuǎn)換。我們不建議你把構(gòu)建文件從Groovy轉(zhuǎn)換為Kotlin作為第一步,當(dāng)然也不要指望我們寫一本關(guān)于如何從Groovy到Kotlin Gradle的書籍。
- Mobile Web Performance Optimization
- R語(yǔ)言數(shù)據(jù)分析從入門到精通
- 新編Premiere Pro CC從入門到精通
- TypeScript實(shí)戰(zhàn)指南
- Learning Apache Mahout Classification
- R Data Analysis Cookbook(Second Edition)
- Terraform:多云、混合云環(huán)境下實(shí)現(xiàn)基礎(chǔ)設(shè)施即代碼(第2版)
- JSP程序設(shè)計(jì)實(shí)例教程(第2版)
- 軟件工程基礎(chǔ)與實(shí)訓(xùn)教程
- Programming Microsoft Dynamics? NAV 2015
- Nagios Core Administration Cookbook(Second Edition)
- Web前端開(kāi)發(fā)技術(shù):HTML、CSS、JavaScript
- INSTANT Premium Drupal Themes
- Clojure Web Development Essentials
- Mapping with ArcGIS Pro