1. 什么是委托屬性?
委托屬性的核心思想是:
- 你可以將一個屬性的?
getter
?和?setter
?的邏輯交給一個外部對象(稱為委托對象)來處理。 - 這個外部對象負責存儲屬性的值,并提供自定義的?
get
?和?set
?行為。
通過委托屬性,你可以:
- 簡化代碼,避免重復。
- 實現屬性的懶加載(Lazy Properties)。
- 監聽屬性的變化(Observable Properties)。
- 將屬性的存儲和邏輯分離。
2.?委托屬性的基本語法
在 Kotlin 中,委托屬性的語法如下:
class MyClass {var property: Type by Delegate
}
by
:用于將屬性的?getter
?和?setter
?委托給一個外部對象(Delegate
)。Delegate
:一個實現了?getProperty
?和?setProperty
?方法的對象,負責處理屬性的存儲和邏輯。
3.?委托屬性的示例
例 1:簡單的委托屬性
假設我們有一個 Delegate
類,它實現了 getProperty
和 setProperty
方法:
class SimpleDelegate {private var value: Int = 0operator fun getValue(thisRef: Any?, property: KProperty<*>): Int {return value}operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {this.value = value}
}
getValue
:用于獲取屬性的值。setValue
:用于設置屬性的值。
然后,我們可以在類中使用這個委托:
class MyClass {var number: Int by SimpleDelegate()
}
number
:這個屬性的?getter
?和?setter
?被委托給?SimpleDelegate
。
使用效果:
val obj = MyClass()
println(obj.number) // 調用 SimpleDelegate 的 getValue
obj.number = 42 // 調用 SimpleDelegate 的 setValue
println(obj.number) // 輸出: 42
例 2:懶加載屬性(Lazy Properties)
Kotlin 標準庫提供了 lazy
委托,用于實現懶加載屬性。懶加載屬性的值在第一次訪問時才會被初始化。
class MyClass {val lazyValue: String by lazy {println("Initializing lazyValue")"Hello, Lazy!"}
}
lazy
:一個標準庫提供的委托,用于實現懶加載。- 初始化邏輯:在第一次訪問?
lazyValue
?時,才會執行初始化邏輯。
使用效果:
val obj = MyClass()
println(obj.lazyValue) // 輸出: Initializing lazyValue \n Hello, Lazy!
例 3:可觀察屬性(Observable Properties)
Kotlin 標準庫還提供了 observable
委托,用于監聽屬性的變化。
import kotlin.properties.Delegatesclass MyClass {var observableValue: String by Delegates.observable("<initial>") {_, old, new ->println("Property changed from $old to $new")}
}
Delegates.observable
:一個標準庫提供的委托,用于監聽屬性的變化。- 回調函數:在屬性值改變時,會調用回調函數。
使用效果:
val obj = MyClass()
obj.observableValue = "New Value" // 輸出: Property changed from <initial> to New Value
?4.?委托屬性的優勢
- 簡化代碼:通過委托,實現屬性的存儲和邏輯分離,避免重復代碼。
- 懶加載:通過?
lazy
?委托,可以實現屬性的懶加載。 - 監聽變化:通過?
observable
?委托,可以監聽屬性的變化。 - 靈活性:可以自定義委托對象,實現更復雜的行為。
5.?總結
- 委托屬性:通過?
by
?關鍵字,將屬性的?getter
?和?setter
?委托給一個外部對象。 - 委托對象:負責存儲屬性的值,并提供自定義的?
get
?和?set
?行為。 - 常見用途:
- 懶加載屬性(
lazy
)。 - 可觀察屬性(
observable
)。 - 自定義委托(如?
SimpleDelegate
)。
- 懶加載屬性(