Kotlin 和 Java 的互操作性是 Kotlin 的一大優點,Kotlin 呼叫 Java 已經基本不需要特別去注意什麼了,但是 Java 呼叫 Kotlin 程式碼就不那麼好看了。專案切換到 Kotlin 的過程中總會有兩種語言交錯的時候,最近切換 Kotlin 的第一版就要上線了,就先總結一下已經遇到的 Java 呼叫 Kotlin 的特殊姿勢。
不一樣的protected
- Kotlin 繼承 Java 時,可以直接拿到 protected 屬性
- Kotlin 繼承 Kotlin 時也一樣
- 但是 Java 繼承 Kotlin 時,需要用 getter 和 setter 操作 protected 屬性
- 舉個例子
[基類定義]
![[Kotlin基礎] Java 呼叫 Kotlin(一)](https://i.iter01.com/images/e95f36061ba9ac4da09e8213ea2e8db8db24bb2f25c988e4285770db653e23ce.png)
[Java 中使用]
![[Kotlin基礎] Java 呼叫 Kotlin(一)](https://i.iter01.com/images/030fe7e96a713832dccb1fa468f69c23fed9e3a1fa0676d0bbc2a8ebf80f5e2a.png)
- 如果在 Kotlin 父類中是用 lazy 宣告的 protected 屬性,在 Java 中獲取還要加上
getValue()
(在 Kotlin 中對應.value
)
取代static的Companion
- Kotlin 中沒有了 static 關鍵字,常量可以使用 伴生物件(companion object) 處理
- 對於絕對的常量,可以使用 const 關鍵字,此時在 Java 中和在 Kotlin 中的呼叫方式是一樣的。const 只適用於直接初始化為一個 value 的情況。
- 沒有 const 修飾的話,Java 中需要使用 getter 來獲取
[常量定義]
![[Kotlin基礎] Java 呼叫 Kotlin(一)](https://i.iter01.com/images/7f4e17e1bea14edb177a38e38054bc83df832e997cb3f93e18980b0a510c6be5.png)
[Kotlin 使用]
![[Kotlin基礎] Java 呼叫 Kotlin(一)](https://i.iter01.com/images/5feaf2f5d179dea3ef3915c5fd9dbb1bea610eef0296ebc64dd83f8a1a3b0ef5.png)
[Java 使用]
![[Kotlin基礎] Java 呼叫 Kotlin(一)](https://i.iter01.com/images/7c8ef93cade9735b7e304d71f11ba5a7f2ac98bd71e1323eb9c73f576f07c90a.png)
擴充套件函式和頂層函式
這兩個都是 Kotlin 的特性,在 Kotlin 中呼叫就是如絲般順滑,但是在 Java 中呼叫還是普通的靜態方法,類名是所在檔名加Kt:
[函式定義]
![[Kotlin基礎] Java 呼叫 Kotlin(一)](https://i.iter01.com/images/a0ef7655ff5753233b78c9e8c40c36c061825d2d7b26a0ba34236b51624ae153.png)
[Kotlin 使用]
![[Kotlin基礎] Java 呼叫 Kotlin(一)](https://i.iter01.com/images/0b8235e01eeb19c21e20542c2c154a2e85dfdc23b1c2a6f3aa853e03510c14e2.png)
[Java 使用]
![[Kotlin基礎] Java 呼叫 Kotlin(一)](https://i.iter01.com/images/f3e0145d991bda5c0236106b99d3eafc2527bbf6e9597b14a051dc5185cdd186.png)
還原lambda
Kotlin 支援函式物件,可以將 lambda 作為函式的引數和返回值,這也是 Java 中沒有的特性,於是在 Java 中呼叫這類方法,就會變成匿名內部類(類名就叫 FunctionX, X是數字,表示引數數量):
[定義一個接收 lambda 的函式]
![[Kotlin基礎] Java 呼叫 Kotlin(一)](https://i.iter01.com/images/c275c34cc4f8434053f22f851839a0363b6fcd3f6026995cda6a823c4b6863c2.png)
[Kotlin 使用]
![[Kotlin基礎] Java 呼叫 Kotlin(一)](https://i.iter01.com/images/f1a3d991fc2db7d6f519aa679c8f80160975e644d4ec349dd8d97dc607a12a1e.png)
[Java 使用]
![[Kotlin基礎] Java 呼叫 Kotlin(一)](https://i.iter01.com/images/98f9884b2bb308598ae5bfbd9ebadebddc4747ab6fbfd54acf02fbbb010468ce.png)
invoke 方法就是 lambda 的內容函式了,這也證明了 Kotlin 中 lambda 的實現方式還是定義了一個介面。使用 lambda 時需要考慮額外的效能開銷,儘量使用 inline 優化效能。
總結
Java 呼叫 Kotlin 並不是特別常用,畢竟我相信用過 Kotlin 之後,就不會想要使用 Java 了。這次情況特殊,在 Kotlin 的新專案中引入了一些過去的 Java Activity,真是沒有對比就沒有傷害啊。我再次重申,Kotlin,好用,炫酷,快來用(安利臉)
字數少了點,有機會再補全一下其他的互調的細節,所以加了個(一)。任何問題歡迎留言討論。RUA。