getter
和 setter
用 Java 開發時最害怕碰到的問題是 NullPointerException (NPE) ,這種異常往往伴隨著非預期運行,這也是 CS 中很著名的「 The Billion Dollar Mistake」。 雖然 Java 對 NPE 這塊也做出了很多的方法去做確保,例如裝飾詞等等,但對於新手而言,還是非常不友善的。
從 Java 跳到 Kotlin 時,會很容易寫出 Java 風格的 Kotlin code ,針對兩者的差別,在 Kotlin 官網中列出了以下項目,這些都是在轉換時很容易碰到的坑
這邊舉一個我剛開始開發 Kotlin 時最常感到困擾的例子,因為在 Java 中可以不用先幫變數附值,但 Kotlin 規定在宣告變數時必須先附值才可以對他做操作,會這麼設計的原因是因為 Kotlin 要確保開發時減少 NPE 產生的機會,雖然剛開始會覺得有點麻煩,但習慣之後真的會減少很多 NPE 問題喔~
Java style:
String word;
word = "Hello java";
System.out.println(word); // Output "Hello java"
Kotlin style:
var word: String = "" // or val word: String = "Hello kotlin"
word = "Hello kotlin"
println("$word") // Output "Hello kotlin"
JetBrain 在打造 Kotlin 時創造了很多特点,比如減少 getter/setter 、類型推斷、省去结尾分號等等。
Kotlin 導入 Null safty 是開發者會跳槽到 Kotlin 很重要的原因之一, JetBrains 將編譯時才能檢查的 NPE ,透過在宣告變數時就必須指定可不可允許儲存 null 類型,變可以在開發時知道會不會引起 NPE,明顯的改善了除錯的時間。
Kotlin 中存在 let
、also
、run
、apply
等豐富的 Scope function ,讓程式碼讀起來更加流暢,而 Kotlin 除了支持 Object-oriented programming 外,也同時支援 Functional programming ,因此,在 Extension Function 和 Lambda Function 上 JetBrains 也下了很大的功夫,將邊寫方法變得十分簡單,開發者多了許多開發上的選擇,同時也提升了程式碼的可讀性與擴展性。
依照我目前的經驗,我最常使用到的是 Null safty 搭配 Scope function 以及 High-order function ,程式碼執行上會更安全且除錯會更方便,另外 Extension function 操作上也非常方便,因此也能取代掉很多 Java 的 Util class。