Kotlin
委任されたプロパティ
サーチ…
前書き
Kotlinはプロパティの実装をハンドラオブジェクトに委譲できます。遅延初期化や観察可能なプロパティなど、いくつかの標準ハンドラが含まれています。カスタムハンドラも作成できます。
遅い初期化
val foo : Int by lazy { 1 + 1 }
println(foo)
この例では、 2
出力されます。
観察可能な特性
var foo : Int by Delegates.observable("1") { property, oldValue, newValue ->
println("${property.name} was changed from $oldValue to $newValue")
}
foo = 2
印刷例foo was changed from 1 to 2
地図に基づくプロパティ
val map = mapOf("foo" to 1)
val foo : String by map
println(foo)
この例では、 1
カスタム委任
class MyDelegate {
operator fun getValue(owner: Any?, property: KProperty<*>): String {
return "Delegated value"
}
}
val foo : String by MyDelegate()
println(foo)
この例では、 Delegated value
出力しDelegated value
デリゲート定型表現を減らすためのレイヤーとして使用できます。
KotlinのNull型システムとWeakReference<T>
考えてみましょう。
だから、何らかのリファレンスを保存しなければならないとしましょう。メモリリークを避けたいのですが、 WeakReference
がどこに来るかはここです。
たとえばこれを取る:
class MyMemoryExpensiveClass {
companion object {
var reference: WeakReference<MyMemoryExpensiveClass>? = null
fun doWithReference(block: (MyMemoryExpensiveClass) -> Unit) {
reference?.let {
it.get()?.let(block)
}
}
}
init {
reference = WeakReference(this)
}
}
今これは1つのWeakReferenceだけです。このボイラープレートを減らすために、カスタムプロパティデリゲートを使用して、次のようにすることができます。
class WeakReferenceDelegate<T>(initialValue: T? = null) : ReadWriteProperty<Any, T?> {
var reference = WeakReference(initialValue)
private set
override fun getValue(thisRef: Any, property: KProperty<*>): T? = reference.get()
override fun setValue(thisRef: Any, property: KProperty<*>, value: T?) {
reference = WeakReference(value)
}
}
これで、 WeakReference
ラップされた変数を、通常のnullable変数と同様に使用できます。
class MyMemoryExpensiveClass {
companion object {
var reference: MyMemoryExpensiveClass? by WeakReferenceDelegate<MyMemoryExpensiveClass>()
fun doWithReference(block: (MyMemoryExpensiveClass) -> Unit) {
reference?.let(block)
}
}
init {
reference = this
}
}
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow