- Java到Kotlin:代碼重構指南
- (英)鄧肯·麥格雷戈 (英)納特·普萊斯
- 1190字
- 2025-01-03 16:16:34
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的不同“紋理”,并在從一門語言逐漸過渡到另一門語言的過程中,對兩者都保有敬畏心。
- 數據科學實戰手冊(R+Python)
- Java多線程編程實戰指南:設計模式篇(第2版)
- 大學計算機應用基礎實踐教程
- Oracle 11g從入門到精通(第2版) (軟件開發視頻大講堂)
- SpringMVC+MyBatis快速開發與項目實戰
- DevOps入門與實踐
- Java加密與解密的藝術(第2版)
- 新手學Visual C# 2008程序設計
- The DevOps 2.4 Toolkit
- 微服務從小白到專家:Spring Cloud和Kubernetes實戰
- Python機器學習:預測分析核心算法
- OpenCV Android Programming By Example
- Ext JS 4 Plugin and Extension Development
- HTML5移動前端開發基礎與實戰(微課版)
- PostgreSQL Developer's Guide