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 isEmpty
hat 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 isEmpty
Eigenschaft 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 size
als auch isEmpty
. isEmpty
ist ein Hintergrundfeld, da der Getter und der Setter für die isEmpty
Eigenschaft davon abhängen.