수색…


소개

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

Delegate 상용구를 줄이기위한 레이어로 사용할 수 있습니다.

Kotlin의 Null Type 시스템과 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)
    }
}

이제 이것은 하나의 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