2017-12-04 3 views
4

Kotlin hat Eigenschaften delegiert, was ein sehr nettes Feature ist. Aber ich finde heraus, wie man die Werte bekommt und setzt. Nehmen wir an, ich möchte den Wert der Eigenschaft erhalten, die delegiert wird. Wie kann ich in einer get() Methode auf den Wert zugreifen?Kotlin-Delegate-Eigenschaft, In einer get() -Methode, wie kann ich auf den Wert zugreifen?

Hier ist ein Beispiel dafür, wie ich umgesetzt haben:

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 
} 

Die Hauptfrage, vermag ich nicht zu verstehen ist: Wie kann ich den Wert auf die tatsächliche Eigenschaft festgelegt, an dem die Delegation Klasse zugeordnet ist. Wenn ich der Eigenschaft p "NEW" zuweise, wie kann ich diesen Wert in der Variablen speichern oder den neuen Wert lesen, der an mit get übergeben wurde? Fehle ich etwas Grundlegendes hier? Jede Hilfe wird sehr geschätzt. Danke im Voraus.

+2

Abrufen und Festlegen Operationen auf S. auf die Instanz des DelegateExample delegiert werden, so gibt es keine wirklichen p vom Typ Zeichenfolge. Verwenden Sie einfach eine Variable in DelegateExample, um den Wert zu speichern. –

Antwort

6

Gerade Eigenschaft in Delegaten, die den Wert

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 
    } 
} 

Um zu klären zu halten - die Delegierten nicht Werte Inhaber sind, sind sie Handler von get/set Operationen. Sie können einen Blick darauf werfen, wie es unter der Haube funktioniert, wenn Sie Ihre Klasse Example dekompilieren (Extras -> Kotlin -> Kotlin-Bytecode anzeigen -> Dekompilieren).

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); 
    } 
} 

keine Magie hier, nur die Schaffung Instanz der DelegateExample und seine get/set Methode aufgerufen

+1

Großartig! Danke für das dekompilierte Klassenbeispiel! – kirtan403

+0

Wirklich so ein großartiges Beispiel! – Priya

Verwandte Themen