第247期 / May 4, 2018

分享到臉書!分享到維特!分享到噗浪!分享到Google+!分享到微博!轉寄友人友善列印

淺談Kotlin,Java終結者?

作者/孫傳峯

[發表日期:2018/5/4]

作者簡歷

畢業於中正大學資訊管理研究所,現任職於凌群電腦技術支援處,專長主要以C#為主,使用visual studio開發工具撰寫winform, console, webpage, webservice,以及BI相關的Reporting Service和 SSIS。專案經歷包含證券交易所、中華電信、台北富邦證券及投資人保護中心等多項開發案及維護。

簡介

一、起源

Kotlin是由俄羅斯聖彼得堡的JetBrains團隊所開發出來的程式語言,其名稱來自於聖彼得堡附近的科特林島。早於2011年就已經被推出,直到2016年2月中才正式發布穩定版本,雖然與Java語法並不相容,但Kotlin被設計成可以和Java code相互運作。

二、理念

Kotlin設計理念是要創建一種兼容Java的語言,讓它比Java更安全,讓它比Java更簡潔,讓它比最競爭對手Scala語言更加簡單。Kotlin 非常適合開發 Android 應用程式,將現代語言的所有優勢帶入 Android 平台而不會引入任何新的限制:
  • 兼容性:Kotlin與JDK完全兼容,確保Kotlin應用程式可以在較舊的Android設備上運行而無任何問題。Kotlin 工具在 Android Studio 中會完全支持,並且兼容Android構建系統。


  • 性能:由於非常相似的位元組碼結構,Kotlin 應用程式的運行速度與 Java 類似。 隨著 Kotlin 對內聯函數的支持,使用lambda表達式的代碼通常比用 Java 寫的代碼運行得更快。


  • 相互操作性:Kotlin可與Java進行100%的相互操作,允許在 Kotlin應用程式中使用所有現有的 Android類別庫。


  • 占用:Kotlin 具有非常緊湊的執行時函式庫,可以使用ProGuard進一步減少。在實際應用程式中,幾百個方法以及apk文件占用不到100K的大小。


  • 編譯時長:Kotlin 支持高效的增量編譯,增量構建通常與Java一樣快或者更快。


  • 學習曲線:對於Java開發人員而言,Kotlin入門容易。Kotlin Koans 透過一系列互動練習提供了主要功能的指南。

2017年在Google I/O大會中,Google也宣布在Android上將為Kotlin提供最佳支援,意味著要將Java取代成Kotlin,Kotlin被稱之為 Android 世界的Swift。


《圖一》Java vs Kotlin(未更改檔案使用增量編譯)
資料來源: http://www.techug.com/post/kotlin-vs-java-compile-speed.html



《圖二》Java vs Kotlin(修改原始碼後使用增量編譯)
資料來源: http://www.techug.com/post/kotlin-vs-java-compile-speed.html


三、特色

Kotlin可以編譯成Java與JavaScript,方便在沒有Java虛擬機(Java Virtual Machine)的設備上運行。為何Kotlin被許多開發人員認為比Java開發容易?是由於有以下幾項特色:
  • 支持型別推論,指程式在編譯期能夠自動推導出值的資料型別。自動推斷型別的能力讓很多編程任務變得容易,讓設計師可以忽略型別標註的同時仍然允許型別檢查。


  • 使用 var 表示變數。val 表示常數,也就相當於 Java 中使用關鍵字 final 常數,數值一旦給定後就不可再更改。其餘型態皆與JAVA相同。


  • function 縮寫成fun。


  • 類別的繼承和實作使用冒號(:)即可。


  • 每句程式碼不需要加分號(;)。

除了上述特色,Kotlin也具備也下的優點:
  • 以JVM為基礎:Kotlin作為一個基於JVM的程式語言,自然可以編譯成Java位元組碼,當他終編譯為Java位元組碼運行的時候,其也就具備了Java的跨平台性能。也就是說其繼承了Java的跨平台的優點。


  • 支援JavaScript:Kotlin可以編譯成 JavaScript,方便在沒有 JVM 的設備上運行,也就是說你可以用Kotlin撰寫程式碼,再編譯為JavaScript在js引擎下運行。


  • 支援Native:透過Kotlin的代碼轉換為Native代碼。Native代碼運行效率是相當高的。


  • 屬於靜態語言:Kotlin的設計定位為一種靜態語言。如C/C++、Java、C#、OC/Swift這些都屬於靜態類型。從型別的強弱來看,Kotlin 是一種強型別的語言,擁有與 Java 類似的型別系統。(強型別是指當遇到函式引數型別和實際叫用型別不符合的情況經常會直接出錯或編譯失敗;弱型別常常會實行隱式轉換,或產生難以意料的結果。)

程式碼開發介紹

Kotlin原始程式碼檔案副檔名為kt,其程式碼撰寫介紹如下:

一、註解

Kotlin註解程式碼的方式有兩種,/*……*/或//,前者的方式可以註解單行或多行程式碼,只要將程式碼前後包住即可;後者僅能註解單行程式碼。範例如下:

/* 這是單行註解 */
/*
第一行
第二行,這種用法為多行註解
*/
// 這是單行註解

二、印出訊息

這是初學者及開發人員必備招式,雖然將一些變數值或結果印出來在應用程式中不常見,但在開發或除錯過程中卻是很需要的。Kotlin使用內建的println與print函式即可以將想要的內容在終端機印出來。範例如下:

// 顯示字串
print("顯示字串")
// 顯示計算結果
print(3 * 6)
// 使用+號連接字串與計算結果,println執行完換行
println("I am " + 變數 + " person ")

三、變數宣告

Kotlin宣告變數使用val及var兩種方式,兩個的差異在於,val(value)宣告不可改變值的變數,var(variable)宣告可以改變值的變數。其變數型態與一般程式語言相同,範例如下:

val va: Byte = 30 // 宣告變數型態為Byte並指定為30
val va1: Byte = 128 // 發生錯誤!指定的數值超過Byte型態範圍

val va2: Int // 宣告變數型態為Int
va2 = 40 // 設定值為40
va2 = 41 // 將變數改為41發生錯誤!因為val是不可改變值的變數
var va3: Int = 30 // 使用var宣告變數
va3 = 31 // 可以將變數值改變

四、判斷式

程式語言常見的判斷語法為if…else及when,Kotlin的寫法也一樣,用法沒太大差異。唯一差別是,Kotlin沒有像Java程式語言的「?:」運算式,也沒有switch用法。範例如下:

val x = 4
val y = 5
val total = 'eight'
if (total == 'nine ') { // total字串是否為”nine”
println("true")
}
else if (total == 'eight ')
println("true") // 只有一行敘述,可以省略{與}
else {
println("false")
}
//取代Java程式語言的「?:」運算式
val min = if (x < y) x else y

when (total) {
'eight' -> min = x
'nine' -> min = y
else -> min = 0
}
when {
total == 'eight ' -> min = x
total == 'nine ' -> min = y
else -> total = 0
}

五、迴圈

Kotlin提供跟一般程式語言相似的迴圈,包含while以及do-while兩種,用來執行重複的工作,與if…else一樣,如果執行的程式只有一行的時候,可以省略大括號。while迴圈使用boolean運算式控制迴圈是否執行。Kotlin進而改良for迴圈,搭配「範圍運算式」,讓for迴圈更簡潔。範例如下:

var i = 0
while (i < 3) { // 使用boolean運算式決定迴圈執行的次數
print(i)
i++
}
do { // do-while與while類似,只是迴圈至少執行一次
print(i)
i++
} while (i < 3)

var total = 0

for (i in 1..10) { //修改過的for迴圈,使用「範圍運算式」
total += i
}
//「範圍運算式」使用規則
// 從min(最小值)到max(最大值)
變數名稱 in ..
// 從min(最小值)到max(最大值),每次增加Y
變數名稱 in .. step

// 從max(最大值)到min(最小值)
變數名稱 in downTo
// 從max(最大值)到min(最小值),每次減少Y
變數名稱 in downTo step

六、存取修飾子

Kotlin提供public、private、internal與protected等關鍵字,可以使用在宣告類別、建構式、介面與函式的宣告。在應用程式套件裡面宣告的類別與函式,使用下列的關鍵字:
  • public:沒有使用關鍵字的時候,預設為public,可以在應用程式任何地方使用


  • private:只能在宣告的檔案中使用


  • internal:只能在同一模組中使用

在類別與介面中宣告,可以使用下面的關鍵字:
  • public:沒有使用關鍵字的時候,預設為public,可以在應用程式任何地方使用


  • private:只能在宣告的類別或介面中使用


  • protected:比private多了可以在子類別或子介面中使用


  • internal:只能在同一模組中使用

總結

許多使用過Kotlin的開發人員認為Kotlin程式碼比Java簡潔(如圖三Java與Kotlin程式碼比較),更易於維護,但是build時間呢?在clean build的情況下,Java比Kotlin 快10-15%,編譯比Kotlin快17%。但隨著增量編譯運行下,Kotlin編譯速度則快於Java。許多原本使用Java開發Android的程式設計師用了Kotlin後就不會想再用Java了,再加上Google在 I/O大會中大力支援下,或許可以成功取代Java,成為 Android界的Swift。


《圖三》Java與Kotlin程式碼比較
資料來源:https://hype.codes/kotlin-vs-java


資料來源

1.Kotlin將取代Java成為Android平台上最受歡迎的語言

2.Kotlin初探,揭開Kotlin的神秘面紗

3.程式語言之 Kotlin 介紹

4.Kotlin Tutorial

5.Kotlin VS Java 編譯速度大比拼,到底誰更快?

6.Kotlin VS Java