2017-12-04 17 views
4

Kotlinはプロパティを委譲しました。これは非常に優れた機能です。しかし、私は値を取得して設定する方法を考え出しています。たとえば、委任されたプロパティの値を取得したいとします。 get()メソッドでは、どのように値にアクセスできますか?ここでkotlin delegateプロパティ、get()メソッドで値にアクセスする方法は?

は、私が実装しているかの例です:

class Example() { 
    var p: String by DelegateExample() 
} 
class DelegateExample { 
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String { 
     return "${property.name} " 
    } 

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) { 
    println("${value.trim()} '${property.name.toUpperCase()} '") 
    } 
} 
fun delegate(): String { 
    val e = Example() 
    e.p = "NEW" 
    return e.p 
} 

私は理解することができません主な質問は、私が委譲クラスが割り当てられている上、実際のプロパティに値を設定することができますどのように、です。プロパティpに「NEW」を割り当てると、その値を変数pに保存するにはどうすればよいですか、またはgetを使用してpに渡す新しい値を読み取ることができますか?私はここに何か基本的なものを欠いていますどんな助けでも大歓迎です。前もって感謝します。

+2

入手し、DelegateExampleのインスタンスに委任されたp上の操作を設定し、そのタイプの本当のpはありません文字列。値を保持するには、DelegateExampleの変数を使用します。 –

答えて

6

ただ、明確にするために値

class DelegateExample { 

    private var value: String? = null   

    operator fun getValue(thisRef: Any?, property: KProperty<*>): String { 
     return value ?: throw IllegalStateException("Initalize me!") 
    } 

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) { 
     this.value = value 
    } 
} 

を保持するデリゲートでプロパティを作成 - デリゲートが値ホルダーではありません、彼らはget/set操作のハンドラです。 Exampleクラスを逆コンパイルすると(Tools - > Kotlin - > Show Kotlin bytecode - > Decompile)、フードの下でどのように動作するかを見ることができます。ただDelegateExampleとそのget/set方法は、呼び出しのインスタンスを作成し、ここで

public final class Example { 
    // $FF: synthetic field 
    static final KProperty[] $$delegatedProperties = ... 

    @NotNull 
    private final DelegateExample p$delegate = new DelegateExample(); 

    @NotNull 
    public final String getP() { 
     return (String)this.p$delegate.getValue(this, $$delegatedProperties[0]); 
    } 

    public final void setP(@NotNull String var1) { 
     Intrinsics.checkParameterIsNotNull(var1, "<set-?>"); 
     this.p$delegate.setValue(this, $$delegatedProperties[0], var1); 
    } 
} 

魔法、

+1

素晴らしい!デコンパイルされたクラスの例をありがとう! – kirtan403

+0

本当にこのような素晴らしい例です! – Priya

関連する問題