官术网_书友最值得收藏!

1.3 Kotlin的“紋理”

Kotlin是一門年輕的語言,但很顯然它與Java有著不同的“紋理”。在撰寫本書時,Kotlin官方主頁“為什么是Kotlin”(https://oreil.ly/pqZbu)給出了4個設計目標:簡明、安全、可互操作和工具友好。Kotlin及其標準庫的設計者還對支持這些設計目標的隱式偏好進行了編碼。這些偏好包括:

? Kotlin更傾向于對不可變的數據進行轉換,而不是修改它們的狀態。數據類使定義具有值語義的新類型變得容易,標準庫使轉換不可變數據的集合比迭代和修改集合的狀態更容易、更簡潔。

? Kotlin更傾向于將行為明確化。例如,類型之間沒有隱含的強制轉換,即使是從較小的范圍到較大的范圍也是如此,Java將int值隱式地轉換為long值(因為沒有精度損失)。在Kotlin中,必須明確地調用Int.toLong()。當涉及控制流時,對明確性的偏愛尤為強烈。盡管你可以為自己的類型重載算術和比較運算符,但不能重載邏輯運算符(&&和||),因為這將允許你定義不同的控制流。

? Kotlin更傾向于靜態而非動態綁定。Kotlin鼓勵類型安全的、組合式的編碼風格。擴展函數是被靜態地綁定的。默認情況下,類是不可擴展的,方法不可以是多態的。你必須顯式地聲明多態和繼承。如果你想使用反射,就必須添加一個特定于平臺的庫依賴。Kotlin從一開始就被設計為與語言感知IDE一起使用,IDE會靜態分析代碼以指導程序員,自動導航,以及自動進行程序轉換。

? Kotlin不擅長處理特殊情況。與Java相比,Kotlin的特殊場景較少,且交互方式不可預測。Kotlin的原始類型和引用類型之間沒有區別。對于無返回值的函數沒有void類型,Kotlin中的函數要么返回一個值,要么根本就不返回。擴展函數允許你為現有的類型添加新的操作,這些類型在調用點看起來是一樣的。你可以將新的控制結構寫成內聯函數,并且break、continue和return語句的作用與內建控制結構的作用相同。

? Kotlin打破了自己的規則,使遷移更容易。Kotlin語言有一些特性,允許常用的Java代碼和Kotlin代碼共存于同一個代碼庫中。其中一些功能取消了類型檢查器提供的保障,它們只應用于與舊版的Java代碼交互操作。例如,lateinit在類型系統中開了一個后門,這樣,通過反射來初始化對象的Java DI(依賴注入)框架就可以繞過通常由編譯器執行的封裝邊界來注入值。如果你把一個屬性聲明為lateinit var,那就得確保代碼在讀取該屬性之前對其進行初始化。編譯器不會發現這類錯誤。

當我們(Nat和Duncan)重新審視我們最早用Kotlin編寫的代碼時,它們往往看起來像是用Kotlin語法寫成的Java代碼。我們在寫了很多年的Java代碼之后轉到Kotlin,根深蒂固的習慣影響了我們編寫Kotlin代碼的方式。我們寫了不必要的模板,沒有充分地利用標準庫,并且避免使用null,因為我們還不習慣使用強制空指針安全的類型檢查器。我們團隊中的Scala程序員更甚,他們的Kotlin代碼看起來就像Kotlin扮演的Haskell,并試圖成為Scala。我們都還沒有找到使用Kotlin的最佳方式。

由于我們需要繼續在Java代碼上工作,在這種情況下,如何地道地使用Kotlin對我們來說略顯復雜。實際上,僅僅學習Kotlin是不夠的,我們必須找到Java和Kotlin的不同“紋理”,并在從一門語言逐漸過渡到另一門語言的過程中,對兩者都保有敬畏心。

主站蜘蛛池模板: 锡林浩特市| 阳春市| 高尔夫| 紫金县| 钟山县| 肃北| 汨罗市| 定安县| 镇坪县| 尼勒克县| 时尚| 承德县| 武邑县| 特克斯县| 瓮安县| 江川县| 会宁县| 交城县| 邓州市| 瑞安市| 迁西县| 马关县| 滁州市| 东宁县| 青河县| 九寨沟县| 方山县| 高青县| 乐都县| 白城市| 和田县| 铁力市| 红安县| 疏附县| 昌宁县| 兴城市| 沾化县| 类乌齐县| 南乐县| 独山县| 平利县|