Delegated properties - kotlin

SeungHyuk Shin·2022년 4월 7일
0
post-thumbnail

몇 가지 일반적인 유형의 속성을 사용하면 필요할 때마다 직접 구현할 수 있지만 한 번 구현하고 라이브러리에 추가한 다음 나중에 다시 사용하는 것이 더 유용합니다. 예를 들어:

  • 게으른 속성: 값은 처음 액세스할 때만 계산됩니다.

  • 관찰 가능한 속성: 수신기는 이 속성의 변경 사항에 대해 알림을 받습니다.

  • 각 속성에 대한 별도의 필드 대신 맵에 속성을 저장합니다.

코틀린은 다음과 같은 경우들을 다루기 위해 위임된 속성들을 지원합니다.

class Example {
    var p: String by Delegate()
}

구문은: val/var <property name>: <Type> by <expression>입니다. 속성에 해당하는 get()(및 set()가 getValue() 및 setValue() 메서드에 위임되기 때문에 by 뒤의 식은 위임입니다. 속성 위임자는 인터페이스를 구현할 필요가 없지만 getValue() 함수를 제공해야 합니다(그리고 setValue()는 var에 대해 제공).

예를들어:

import kotlin.reflect.KProperty

class Delegate {
  operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
      return "$thisRef, thank you for delegating '${property.name}' to me!"
  }

  operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
      println("$value has been assigned to '${property.name}' in $thisRef.")
  }
}

위임의 인스턴스에 위임하는 p에서 읽으면 위임의 getValue() 함수가 호출됩니다. 첫 번째 매개 변수는 p를 읽는 개체이고 두 번째 매개 변수는 p 자체에 대한 설명을 포함합니다(예: 이름을 지정할 수 있음).

val e = Example()
println(e.p)

다음을 출력합니다.

Example@33a17727, thank you for delegating 'p' to me!

마찬가지로 p에 할당하면 setValue() 함수가 호출됩니다. 첫 번째 두 매개 변수는 동일하며 세 번째 매개 변수는 할당되는 값을 유지합니다.

e.p = "NEW"

다음을 출력합니다.

NEW has been assigned to 'p' in Example@33a17727.

위임된 개체에 대한 요구 사항의 사양은 아래에서 확인할 수 있습니다.

함수 또는 코드 블록 내에서 위임된 속성을 선언할 수 있으며, 클래스의 구성원이 아니어도 됩니다. 아래에서 예를 찾을 수 있습니다.

Standard delegates

Kotlin 표준 라이브러리는 몇 가지 유용한 유형의 위임자들에게 팩토리 메서드를 제공합니다.

Lazy Properties

lazy()는 Lambda를 가져와서 Lazy의 인스턴스를 반환하는 함수이며, Lazy 속성을 구현하기 위한 대리자 역할을 할 수 있습니다. get()에 대한 첫 번째 호출은 lazy()에 전달된 람다를 실행하고 결과를 기억합니다. get()에 대한 후속 호출은 단순히 기억된 결과를 반환합니다.

0개의 댓글