코틀린 공식 라이브러리에서는 여러 위임상황에 대해서 팩토리 메서드들을 제공해준다.
코틀린에서는 객체를 생성하는 시점에 프로퍼티를 초기화 하는것이 아닌, 처음 접근하는 시점 (사용하는 시점)에 초기화를 진행하는 lazy properties를 제공한다고 언급했었다. 이번 챕터에서 어떻게 제공 해주는지 한번 알아보자.
val lazyValue: String by lazy {
println("computed!")
"Hello"
}
fun main() {
println(lazyValue)
println(lazyValue)
}
lazy()는 람다식을 파라미터로 전달 받고 Lazy의 인스턴스를 반환 하는 메서드다. delegate의 역할로도 사용할 수 있다. 만약 위 예제처럼 lazyValue를 lazy()를 이용해 위임처리 한다면 어떻게 동작할까
먼저 첫번째 lazyValue에 접근하게 되면 아직 해당 프로퍼티는 초기화 되지 않은 상태
라서 람다식을 실행시킨다. 그리고 lazyValue에 값을 할당하게 된다. 그런 다음 다시 해당 프로퍼티에 접근하게 되면 람다식을 실행 시키는 것이 아닌 lazyValue에 저장된 값이 호출 되는 것이다.
기본적으로 thread safe하게 동작하며
value에 할당된 값이 없는경우 initializer (람다식)을 실행시켜 값을 저장함과 동시에 리턴해준다.리스너가 프로퍼티의 값 변경에 대한 알림을 받기위해 제공해주는 Observable properties다. Delegates.observable() 메서드는 기본적으로 2개의 파라미터를 가지는데 첫번째 파라미터는 초기화 할 값
이 되며 두 번째 파라미터는 값이 변경 되었을 때 수행 할 핸들러 람다식을 넘겨주면 된다.
import kotlin.properties.Delegates
class User {
var name: String by Delegates.observable("<no name>") {
prop, old, new ->
println("$old -> $new")
}
}
fun main() {
val user = User()
user.name = "first"
user.name = "second"
}