// val/var <프로퍼티명>: <타입> by <표현식>
by
뒤의 표현식이 위임 객체(delegate)가 된다.
get()
, set()
을 자신의 getValue()
와 setValue()
메서드에 위임한다.getValue()
와 setValue()
(var의 경우)를 제공해야 한다.lazy()
함수는 람다를 받아 Lazy<T>
인스턴스를 반환한다.get()
호출 시 람다가 실행되고 결과가 저장되어 이후에는 저장된 결과를 반환한다.val lazyValue: String by lazy {
println("계산 중...")
"Hello"
}
LazyThreadSafetyMode.PUBLICATION
lazy
프로퍼티의 평가는 동기화 되어 하나의 스레드에서만 값이 계산되지만 모든 스레드에서 같은 값을 볼 수 있다.LazyThreadSafetyMode.PUBLICATION
를 전달하면 된다.LazyThreadSafetyMode.NONE
LazyThreadSafetyMode.NONE
을 사용할 수 있다.Delegates.observable()
은 초기값과 변경 핸들러를 인자로 받는다.var name: String by Delegates.observable("초기값") {
prop, old, new -> println("$old -> $new")
}
vetoable()
을 사용할 수 있다.class Example {
var newName: String = "Kotlin"
@Deprecated("이 프로퍼티는 곧 삭제될 예정입니다")
var oldName: String by ::newName
}
class User(val map: Map<String, Any?>) {
val name: String by map
val age: Int by map
}
val user = User(mapOf(
"name" to "John Doe",
"age" to 25
))
println(user.name) // Prints "John Doe"
println(user.age) // Prints 25
fun example(computeFoo: () -> Foo) {
val memoizedFoo by lazy(computeFoo)
if (someCondition && memoizedFoo.isValid()) { // 여기서 접근할 때 할당
memoizedFoo.doSomething()
}
}
val
)의 경우 위임 객체는 다음 파라미터를 가진 getValue()
연산자 함수를 제공해야 한다.
thisRef
: 프로퍼티 소유자와 같은 타입 또는 상위 타입property: KProperty<*>
타입 또는 상위 타입getValue
는 같은 타입 또는 서브 타입을 반환해야 한다.var
)의 경우 추가로 setValue()
를 제공해야 한다.operator
키워드로 표현되어야 한다.class Resource
class Owner {
val valResource: Resource by ResourceDelegate()
}
class ResourceDelegate {
operator fun getValue(thisRef: Owner, property: KProperty<*>): Resource {
return Resource()
}
}
ReadOnlyProperty
와 ReadWriteProperty
인터페이스를 통해 위임 객체를 더 쉽게 구현할 수 있게 해준다.val readOnlyResource: Resource by resourceDelegate()
var readWriteResource: Resource by resourceDelegate()
fun resourceDelegate(): ReadWriteProperty<Any?, Resource> =
object : ReadWriteProperty<Any?, Resource> {
var resource = Resource()
override fun getValue(thisRef: Any?, property: KProperty<*>) = resource
override fun setValue(thisRef: Any?, property: KProperty<*>, value: Resource) {
resource = value
}
}