아이템 21 - 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라
ds_chanin
·2023. 5. 14. 19:02
지연 프로퍼티
lazy 프로퍼티는 이후에 처음 사용하는 요청이 들어올 때 초기화되는 프로퍼티를 의미한다.
지연프로퍼티를 java에서 구현하려면 복합한 과정이 필요한데 코틀린은 프로퍼티 위임을 이용하여 간단하게 구현할 수 있다.
val value by lazy { createValue() }
Delegates.observable을 이용하면 프로퍼티 위임을 사용하면 변화를 감지하는 옵저버 패턴도 쉽게 만들 수 있다.
var catchedChessPeices: List<ChessPeice> by
Delegates.observable(listOf()) { _, old, new ->
checkKingDied(new)
}
위와 같이 프로퍼티 위임 메커니즘을 사용하면 뷰, 리소스 바인딩, 의존성 주입, 데이터 바인딩 등 다양한 패턴을 만들 수 있다.
프로퍼티 위임을 직접 만드는 경우 메서드 이름을 정확하게 지어야 한다.
- getValue (val, var의 경우)
- setValue (var의 경우)
class LoggingProperty<T>(var value: T) {
operator fun getValue(
thisRef: Any?,
prop: KProperty<*>
): T {
print("${prop.name} returned value $value")
return value
}
operator fun setValue(
thisRef: Any?,
prop: KProperty<*>,
newValue: T
) {
print("name changed from $value to $newValue")
value = newValue
}
}
프로퍼티 위임을 이용하면 자바와 비교하여 포워딩 객체를 사용하기 편해진다.
interface MyInterface {
fun foo()
}
class ForwardingClass : MyInterface {
override fun foo() {
println("delegate")
}
}
class MyClass(
val fowardingClass: ForwardingClass
) : MyInterface by fowardingClass
'스터디 > 이펙티브코틀린' 카테고리의 다른 글
아이템 24 - 제네릭 타입과 variance 한정자를 활용하라 (0) | 2023.05.14 |
---|---|
아이템 23 - 타입 파라미터의 섀도잉을 피하라 (0) | 2023.05.14 |
아이템 19 - knowledge를 반복하여 사용하지 말라 (0) | 2023.05.03 |
아이템 17 - 이름 있는 아규먼트를 사용하라 (0) | 2023.04.27 |
아이템 16 - 프로퍼티는 동작이 아니라 상태를 나타내야 한다 (0) | 2023.04.27 |