Anfangs hatte auch ich Schwierigkeiten, dieses Konzept zu verstehen. Lassen Sie es mich Ihnen anhand eines Beispiels erklären.
Betrachten Sie diese Kotlin-Klasse
class DummyClass {
var size = 0;
var isEmpty
get() = size == 0
set(value) {
size = size * 2
}
}
Wenn wir uns nun den Code ansehen, können wir sehen, dass er zwei Eigenschaften hat, nämlich - size(mit Standard-Accessoren) und isEmpty(mit benutzerdefinierten Accessoren). Aber es hat nur 1 Feld dh size. Um zu verstehen, dass es nur ein Feld gibt, sehen wir uns das Java-Äquivalent dieser Klasse an.
Gehen Sie zu Extras -> Kotlin -> Kotlin ByteCode in Android Studio anzeigen. Klicken Sie auf Dekompilieren.
public final class DummyClass {
private int size;
public final int getSize() {
return this.size;
}
public final void setSize(int var1) {
this.size = var1;
}
public final boolean isEmpty() {
return this.size == 0;
}
public final void setEmpty(boolean value) {
this.size *= 2;
}
}
Wir können deutlich sehen, dass die Java-Klasse nur Getter- und Setter-Funktionen für isEmptyhat und kein Feld dafür deklariert ist. Ebenso gibt es in Kotlin kein Hintergrundfeld für die Eigenschaft isEmpty, da die Eigenschaft überhaupt nicht von diesem Feld abhängt. Also kein Hintergrundfeld.
Lassen Sie uns nun den benutzerdefinierten Getter und Setter der isEmptyEigenschaft entfernen .
class DummyClass {
var size = 0;
var isEmpty = false
}
Und das Java-Äquivalent der obigen Klasse ist
public final class DummyClass {
private int size;
private boolean isEmpty;
public final int getSize() {
return this.size;
}
public final void setSize(int var1) {
this.size = var1;
}
public final boolean isEmpty() {
return this.isEmpty;
}
public final void setEmpty(boolean var1) {
this.isEmpty = var1;
}
}
Hier sehen wir sowohl die Felder sizeals auch isEmpty. isEmptyist ein Hintergrundfeld, da der Getter und der Setter für die isEmptyEigenschaft davon abhängen.