無論您最熟悉的 java、scala 還是其它 jvm 語言,總會有更多 jvm 語言不斷出現并伴随着各種相關特性。最重要的是,總有一些來自某些語言的、優秀的 “基本” 元素在其它語言中難覓其蹤。

正因為如此,我們整理出了這樣一篇精簡的囊括 groovy、scala、clojure、kotlin 以及 java 的部分最佳特性的文章。闡述了它們的差別,以幫助你在項目研發裡面合理的選擇他們。
是否檢查異常情況
java 中最具争議的特性當屬 checked exceptions,checked exceptions 會在編譯時強制執行,同時需要進行某種排序處理。這意味着我們需要在方法中對其進行捕捉或者聲明。
雖然部分開發者更傾向于忽略 checked exceptions,但這一特性确實能夠強制要求大家處理例外情況并借此改善代碼品質。是以,雖然其人氣不高甚至在一定程度上可以忽略,但必須承認其對于提升編碼思路還是有所助益的。
kotlin、clojure、groovy以及scala都不支援checked exceptions。
非空即真的 elvis 操作符
在這裡之是以選擇 elvis 操作符作為讨論對象,是因為其是一種相當便捷的預設值處理方式,且有助于降低重構情況下的錯誤風險。在它的幫助下,我們無需複制表達式以進行條件與主動傳回值測試,進而輕松實作 null safety。
elvis 這個二進制運算操作符會傳回第一個為 true 的操作數,否則則傳回第二個操作數。elvis 操作符屬于三元運算符的精簡版(三元運算符同樣可用于 java),後者本身又是用于将值配置設定至變量的 if/else 分支表達式的精簡版。下面是 groovy 代碼示例:
kotlin 同樣使用 elvis 操作符在 null 引用中實作 null 安全,但必須使用 “?”。如果該操作符左側的表達式非 null,則 elvis 會将其傳回。否則,其傳回該操作符右側的表達式。整個過程可以簡單翻譯為以下行:
java 并不提供 elvis 操作符,但其利用類似的方式實作 null safety,是以大家需要在處理 null 輸入時做好準備。大家可以使用 optional 作為可選方案,其能夠容納一個可以或不可以包含非 null 值的對象。是以如果某個值切實存在,ispresent() 将傳回 true 而用 get() 将傳回該值。
同樣,scala 采用類似的 optional[t] 實作相同效果。其能夠容納符合特定類型的 0 或 1 元素。如果某值缺失,大家會收到具有 none 值的 some[t]。
類似弱類型語言的類型推斷機制
kotlin 和 scala 都引入了一種類型推斷機制,允許我們在定義變量的時候不需要指定類型,即整形、字元串、浮點型等等。而由語言本身在運作的時候去決定這個變量是什麼類型,下面是基于 scala 和 kotlin 定義變量的執行個體。
因為類型推斷機制給我們帶來了很多優勢,比如不用去記去寫很多繁瑣的字元,是以甲骨文意識到這點,并且開始向技術社群征求實作局部變量推斷的意向調查,這說明在未來,java 将有機會引入這個機制。
java 即将引入節約時間成本的 repl
clojure、groovy、kotlin 以及 scala 都具有一個節約時間成本的指令行工具 read-eval-print-loop(簡稱 repl)。該工具允許在無需打包為類或者方法的前提下直接運作語句、如果我們需要立即獲得回報,那麼這種方法顯然更加簡便易行。
好消息是,java 9 即将引入 longtools 軟體包,而 repl 正是其中的組成部分,該工具将允許我們評估聲明、語句及表達式,也能夠在 jshell 持續讀取使用者輸入内容、評估輸入内容并顯示輸入值或者因輸入造成的狀态變更說明,進而快速完成代碼原型設計。