프로퍼티 위임(lazy, observable) - 코틀린
코틀린 공식 라이브러리에서는 여러 위임상황에 대해서 팩토리 메서드들을 제공해준다.
Lazy properties
코틀린에서는 객체를 생성하는 시점에 프로퍼티를 초기화 하는것이 아닌, 처음 접근하는 시점 (사용하는 시점)에 초기화를 진행하는 lazy properties를 제공한다고 언급했었다. 이번 챕터에서 어떻게 제공 해주는지 한번 알아보자.
val lazyValue: String by lazy {
println("computed!")
"Hello"
}
fun main() {
println(lazyValue)
println(lazyValue)
}
lazy()는 람다식을 파라미터로 전달 받고 Lazy의 인스턴스를 반환 하는 메서드다. delegate의 역할로도 사용할 수 있다. 만약 위 예제처럼 lazyValue를 lazy()를 이용해 위임처리 한다면 어떻게 동작할까
먼저 첫번째 lazyValue에 접근하게 되면 아직 해당 프로퍼티는 초기화 되지 않은 상태
라서 람다식을 실행시킨다. 그리고 lazyValue에 값을 할당하게 된다. 그런 다음 다시 해당 프로퍼티에 접근하게 되면 람다식을 실행 시키는 것이 아닌 lazyValue에 저장된 값이 호출 되는 것이다.
- 실제로 lazy() 메서드의 로직을 살펴보면
기본적으로 thread safe하게 동작하며
value에 할당된 값이 없는경우 initializer (람다식)을 실행시켜 값을 저장함과 동시에 리턴해준다.- 기본적으로 해당 로직은 단일 쓰레드에서 수행되는데 멀티 쓰레드에서 로직을 수행할 수 있게 하려면 lazy()메서드의 파라미터로 LazyThreadSafetyMode.PUBLICATION을 넘겨주면 된다.
- 그리고 다시 호출 하는 경우 이미 초기화가 되었기 때문에 initializer를 호출하지 않고 바로 값을 반환하는 것을 볼 수 있다.
Observable properties
리스너가 프로퍼티의 값 변경에 대한 알림을 받기위해 제공해주는 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"
}
- 두번째 파라미터로 넘겨줄 핸들러 람다식은 값이 변경될 때 콜백으로 호출 된다. 위 코드를 실행시켜보면
- observable의 첫번째 파라미터로 넘겨준 값으로 우선 name이 초기화가 되고 이후에 값을 써줄 때 마다 handler callback이 호출 되어 print 로직이 수행 되는것을 볼 수 있다.
참고
https://kotlinlang.org/docs/delegated-properties.html
Author And Source
이 문제에 관하여(프로퍼티 위임(lazy, observable) - 코틀린), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@seokgyuhong/프로퍼티-위임lazy-observable-코틀린저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)