2017-12-06 1 views
-3

Ich habe Kotlin offiziellen Tutorial betrachtet. Ich kam in die Backing FelderKotlin erklären Sie mir über Backing Fields

Es sagt genannt Thema,

Klassen in Kotlin können keine Felder haben. Bei Verwendung von benutzerdefinierten Zugriffsmethoden ist jedoch manchmal ein Hintergrundfeld erforderlich. Für diese Zwecke bietet Kotlin ein automatisches Trägerfeld, das die Feldkennung zugegriffen werden kann:

var counter = 0 // the initializer value is written directly to the backing field 
    set(value) { 
     if (value >= 0) field = value 
    } 

bekam ich die oben von this official link

Meine Frage ist, ist das „Feld“ zeigt Zähler variabel?

Kann mir bitte jemand ein Beispiel für das Hintergrundfeld geben oder mich in einem verständnisvollen Wort beschreiben?

+0

Warum negativ am Anfang? –

+0

Zum einen ist der Code, den Sie gepostet haben, nicht der gesamte Codebeispiel. Die Leute sollten nicht zu externen Links gehen müssen, um das vollständige Bild zu erhalten. Ja, es sieht so aus, als ob "Feld" ein spezielles Schlüsselwort ist, das Mutanten beim Setzen unterstützt. – Phix

Antwort

3

Betrachten Sie diese Klasse

class SomeClass { 
    var counter: Int = 0 
     set(value) { 
      if (value >= 0) field = value 
     } 
} 

In Android Studio gehen zu Main menu -> Tools -> Kotlin -> Show Kotlin Bytecode und klicken Decompile im Kotlin Bytecode-Panel.

Was Sie sehen, ist der entsprechende Code in Java.

public final class SomeClass { 
    private int counter; 

    public final int getCounter() { 
     return this.counter; 
    } 

    public final void setCounter(int value) { 
     if(value >= 0) { 
     this.counter = value; 
     } 
    } 
} 
+0

Sie haben den Weg geebnet, um auch andere Probleme herauszufinden ... Vielen Dank. –

1

Wie es funktioniert, lassen Sie uns durch ein Beispiel verstehen, dieses

class Person { 
    var name: String = "" 
} 

betrachten Wenn nichts angegeben wird, verwendet die Eigenschaft (Name) die Standard-Getter und Setter. Es kann natürlich modifiziert werden, was individuelle Verhalten, das Sie ohne benötigen, laufen den vorhandenen Code zu ändern:

Also, wenn nach Name Eigenschaft benutzerdefinierte Verhalten wollen, als wir oben Klasse diese

class Person { 

    var name: String = "" 
    get() = field.toUpperCase() 
    set(value) { 
    field = "Name: $value" 
    } 


} 
ändern

Wenn die Eigenschaft in einem benutzerdefinierten Getter oder Setter auf einen eigenen Wert zugreifen muss (wie in diesem Fall ), muss ein Hintergrundfeld erstellt werden. Es kann zugegriffen werden, indem Feld verwendet, ein reserviertes Wort, und wird automatisch vom Compiler erstellt, wenn es findet es wird verwendet.

1

A Backing Field ist nur ein Feld, das nur für eine Eigenschaft in einer Klasse erzeugt wird, wenn es die Standardimplementierung von mindestens einem der Accessoren

Backing Feld erzeugt wird, verwendet nur wenn eine Eigenschaft die Standardimplementierung von Getter/Setter verwendet. Wenn Sie den folgenden Code mit der Perspektive Java sehen. Es sieht korrekt aus. In "kotlin" wird jedoch Exception ausgelöst.

class User{ 
     var firstName : String //backing field generated 
     get() = firstName 
     set(value) { 
      firstName = value 
     } 
     var lastName : String //backing field generated 
     get() = lastName 
     set(value) { 
      lastName = value 
     } 
     val name : String //no backing field generated 
     get() = "{$firstName $lastName}" 
     var address : String = "XYZ" //^because there is no default //^implementation of an accessor 
} 

In Kotlin das obige Codefragment wird Stackoverflow werfen, denn wenn wir Eigenschaft zugreifen oder auf „first-name“ oder „Nachname“ der Standard-Accessor aufgerufen wird. Also in Kotlin "user.firstName =" value "" ist gleich wie Java "user.setFirstName (" value ")".

Also, wenn "set (wert) {firstName =" wert "}" dann aufgerufen wird eine rekursive CallHappens und Compiler löst eine Exception Ausnahme, weil wir Setter innerhalb der Setter aufrufen

Lösung für dieses Problem ist, Benutzer sichern Felder.In Kotlin kann ein Backing-Feld mit "Feld" Schlüsselwort innerhalb Zugriffsmethoden zugegriffen werden.Sehen Sie sich das korrigierte Code-Snippet an.

class User{ 
     var firstName : String get() = field 
     set(value) { 
      field = value 
     } 
     var lastName : String get() = field 
     set(value) { 
      field = value} 
     } 
} 

Ich hoffe, es ist Ihnen klar. Wenn Sie mehr Hilfe benötigen, fragen Sie mich .. danke

2

Das Schlüsselwort field ermöglicht Ihnen, einen Wert innerhalb eines benutzerdefinierten Setter zuzuweisen. In Kotlin counter = 3 wird set(3) anrufen. Wenn Sie also definieren würden

Es würde sich rekursiv selbst aufrufen, bis Ihr Stapel voll ist und Ihr Prozess abstürzt. Das Schlüsselwort field weist den Wert direkt zu, ohne den Setter erneut aufzurufen.

Verwandte Themen