専門委任(lazy,observice)-コトリン

4616 ワード

コットリン公式ライブラリは各種の委任状況に工場方法を提供する.

Lazy properties


コットリン氏は、オブジェクトを作成するときに、初期アクセスポイント(使用ポイント)で初期化するのではなくlazy propertiesを提供すると述べた.この章がどのように提供されているかを理解してみましょう.
val lazyValue: String by lazy {
    println("computed!")
    "Hello"
}

fun main() {
    println(lazyValue)
    println(lazyValue)
}
Lazy()は、ラムダ式をパラメータとして伝達し、Lazyインスタンスを返す方法である.依頼役としても使えます.Lazy()を使用してLazyValueを委任する場合、どうすればいいですか?
まず、最初のLazyValueにアクセスすると、프로퍼티는 초기화 되지 않은 상태であるため、ramda式が実行されます.LazyValueに値が割り当てられます.次に、プログラムに再度アクセスすると、ram式を実行するのではなくLazyValueに格納された値が呼び出されます.

-実際の実行例でLazyValueに初めてアクセスした場合、ram式は初期化されずに実行され、println(「computed!」)が維持されます.その後、LazyValueを再度呼び出すと、LazyValueに格納されている値が呼び出されます.
  • が実際にlazy()メソッドである論理で기본적으로 thread safe하게 동작하며の値に値が指定されていない場合、initializer(ラムダ式)が実行され、値を保存しながら値が返されます.
  • デフォルトでは、この論理は単一のスレッド上で実行されます.マルチスレッドが論理を実行できるようにするには、lazy()メソッドのパラメータLazyThreadSafetyModeを使用します.PUBLICATIONにお任せください
  • で再呼び出されると初期化が表示されるのでinitializerは呼び出されずに直接値が返されます.
  • Observable properties


    これは、property値の変更に関する通知を受信するために、リスナーによって提供される観測可能な属性です.Delegates.observate()メソッドには基本的に2つのパラメータがあり、1つ目のパラメータは초기화 할 값、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"
    }
  • の2番目のパラメータに渡されるハンドル式は、値が変更されたときに呼び出されます.上記のコードを実行すると
  • が表示されます.
  • observiceに渡される最初のパラメータの値は、まずnameを初期化し、その後、値を書き込むたびにhandler callbackが呼び出され、印刷ロジックが表示されます.
  • リファレンス
    https://kotlinlang.org/docs/delegated-properties.html