kotlin 基礎 inline class 18

kotlin.jpeg
在 kotlin 中對 java 進行優化就是將 java 的 class 進行細分為許多不同 class,在 java 每個類有些附加或者說額外的方法是多數場合是不會被用到的。我們需要不斷減輕類的負擔。去掉一些額外的方法,從而減少記憶體分配來提高效能。
inline class Password(val value: String)

inline.jpeg
inline class Animal(val name:String){ val age:Int get() = 5 fun move(){ println("moving...") } } fun main(args: Array<String>) { val zidea = EmployeA.create() println(zidea.name) var password = Password("123") println(password.value) val cat = Animal("miao") println(cat.age) println(cat.name) }
inline 類在執行期可以看做一個包裝類或底層型別,底層型別就是類似 int 整型型別
- inline 類不支援 init 方法
- inline 類不支援 backing field
問題來了什麼是 backing field 呢,在類中定義一個成員變數,Kotlin 會自動生成預設setter/getter方法。而 Kotlin 提供了一種非常特殊的方式宣告setter/getter方法
var name: String? = null set(value) { field = value } get() = field
例項化這個類,然後對當前例項的name屬性進行賦值並取值。Oops…結果,你會發現,無論是取值還是賦值都出現遞迴呼叫。
inline class Animal(val name:String):Imove{ val age:Int get() = age
Exception in thread "main" java.lang.StackOverflowError at Animal.getAge-impl(ClientC.kt:18) at Animal.getAge-impl(ClientC.kt:18) at Animal.getAge-impl(ClientC.kt:18) at Animal.getAge-impl(ClientC.kt:18)
backing field的作用域僅僅存在於當前屬性的setter/getter方法中,field 就像綁定了當前屬性的一樣。因此,我認為翻譯成備份屬性也許更合適
interface Imove{ fun move() } inline class Animal(val name:String):Imove{ val age:Int get() = 5 override fun move(){ println("moving...") } }
inline 類在執行期可以看做一個包裝類或底層型別,底層型別就是類似 int 整型型別

Learn-a-Programming-Language-Step-24.jpg