Getter und Setter werden in Kotlin automatisch generiert. Wenn Sie schreiben:
val isEmpty: Boolean
Es entspricht dem folgenden Java-Code:
private final Boolean isEmpty;
public Boolean isEmpty() {
return isEmpty;
}
In Ihrem Fall ist der Modifikator für den privaten Zugriff redundant - isEmpty ist standardmäßig privat und kann nur von einem Getter aufgerufen werden. Wenn Sie versuchen, die isEmpty-Eigenschaft Ihres Objekts abzurufen, rufen Sie die get-Methode in real auf. Zum besseren Verständnis der Getter / Setter in Kotlin: Die beiden folgenden Codebeispiele sind gleich:
var someProperty: String = "defaultValue"
und
var someProperty: String = "defaultValue"
get() = field
set(value) { field = value }
Ich möchte auch darauf hinweisen, dass this
in einem Getter nicht Ihr Eigentum ist - es ist die Klasseninstanz. Wenn Sie in einem Getter oder Setter Zugriff auf den Feldwert erhalten möchten, können Sie das reservierte Wort field
dafür verwenden:
val isEmpty: Boolean
get() = field
Wenn Sie nur eine get-Methode für den öffentlichen Zugriff haben möchten, können Sie diesen Code schreiben:
var isEmpty: Boolean
private set
Aufgrund des privaten Modifikators in der Nähe des Set-Accessors können Sie diesen Wert nur in Methoden innerhalb Ihres Objekts festlegen.
In your case the private access modifier is redundant
Wie? Der Standardmodifikator von Kotlin Docs ist öffentlich. kotlinlang.org/docs/reference/visibility-modifiers.htmlval isEmpty: Boolean
wird nicht kompiliert, da isEmpty noch nicht initialisiert ist, oder? Ich fange gerade an, Kotlin zu lernen. Und was passiert mitget() = field
?val
's haben keinen SetterDie Regeln für Sichtbarkeitsmodifikatoren von Eigenschaftszugriffsberechtigten lauten wie folgt:
Die bessere Sichtbarkeit von
var
undval
Eigenschaft sollte genau der Sichtbarkeit der Eigenschaft entsprechen. Sie können den Eigenschaftsmodifikator daher nur explizit duplizieren, er ist jedoch redundant:protected val x: Int protected get() = 0 // No need in `protected` here.
Die Sichtbarkeit des
var
Objekts sollte gleich oder weniger zulässig sein als die Sichtbarkeit des Objekts:protected var x: Int get() = 0 private set(x: Int) { } // Only `private` and `protected` are allowed.
In Kotlin wird auf Eigenschaften immer über Getter und Setter zugegriffen, sodass es nicht erforderlich ist, eine Eigenschaft
private
mitpublic
Accessoren wie in Java zu erstellen - das Hintergrundfeld (falls vorhanden) ist bereits privat. Daher werden Sichtbarkeitsmodifikatoren für Eigenschaftszugriffsmethoden nur verwendet, um die Sichtbarkeit des Setters weniger zulässig zu machen:Für eine Eigenschaft mit Hintergrundfeld und Standard-Accessoren:
var x = 0 // `public` by default private set
Für eine Eigenschaft ohne Hintergrundfeld:
var x: Int // `public` by default get() = 0 protected set(value: Int) { }
quelle
x
einige"Some String"
und geben Sie die Länge11
der Zeichenfolge zurück.private
aus einer Variablen entfernt und sie wurde von einer anderen Klasse mit Getter zugänglich.1) Beispiel Standard
setter
undgetter
für EigenschaftfirstName
in Kotlinclass Person { var firstName: String = "" get() = field // field here ~ `this.firstName` in Java or normally `_firstName` is C# set(value) { field = value } }
Verwenden von
val p = Person() p.firstName = "A" // access setter println(p.firstName) // access getter (output:A)
IF Ihre
setter
odergetter
ist genau die gleiche oben, können Sie es entfernen , weil es ist nicht notwendig2) Beispiel für einen benutzerdefinierten Setter und Getter.
const val PREFIX = "[ABC]" class Person { // set: if value set to first name have length < 1 => throw error else add prefix "ABC" to the name // get: if name is not empty -> trim for remove whitespace and add '.' else return default name var lastName: String = "" get() { if (!field.isEmpty()) { return field.trim() + "." } return field } set(value) { if (value.length > 1) { field = PREFIX + value } else { throw IllegalArgumentException("Last name too short") } } }
Verwenden von
val p = Person() p.lastName = "DE " // input with many white space println(p.lastName) // output:[ABC]DE. p.lastName = "D" // IllegalArgumentException since name length < 1
Mehr
Ich fange an, Kotlin von Java zu lernen, daher bin ich verwirrt
field
undproperty
weil es in Java keine gibtproperty
.Nach einiger Suche sehe ich
field
undproperty
in Kotlin sehe es aus wie C # ( Was ist der Unterschied zwischen einem Feld und einer Eigenschaft? )Hier ist ein relevanter Beitrag, der über
field
undproperty
in Java und Kotlin spricht .Hat Java etwas Ähnliches wie C # -Eigenschaften?
https://blog.kotlin-academy.com/kotlin-programmer-dictionary-field-vs-property-30ab7ef70531
Korrigieren Sie mich, wenn ich falsch liege. Hoffe es hilft
quelle
Getter in Kotlin ist standardmäßig öffentlich, aber Sie können den Setter auf privat setzen und den Wert mithilfe einer Methode innerhalb einer Klasse festlegen. So was.
/** * Created by leo on 17/06/17.*/ package foo class Person() { var name: String = "defaultValue" private set fun foo(bar: String) { name = bar // name can be set here } } fun main(args: Array<String>) { var p = Person() println("Name of the person is ${p.name}") p.foo("Jhon Doe") println("Name of the person is ${p.name}") }
quelle
Sie können dieses Tutorial für weitere Informationen sehen:
Noch ein Kotlin Tutorial für Android Entwickler
quelle
Hier ist ein praktisches Beispiel aus der Praxis für einen Kotlin Getter und Setter (Weitere Details finden Sie hier ):
// Custom Getter val friendlyDescription get(): String { val isNeighborhood = district != null var description = if (isNeighborhood) "Neighborhood" else "City" description += " in" if (isNeighborhood) { description += " $city," } province?.let { if (it.isNotEmpty()) { description += " $it," } } description += " $country" return description } print(myLocation.friendlyDescription) // "Neighborhood in Denver, Colorado, United States" // Custom Setter enum class SearchResultType { HISTORY, SAVED, BASIC } private lateinit var resultTypeString: String var resultType: SearchResultType get() { return enumValueOf(resultTypeString) } set(value) { resultTypeString = value.toString() } result.resultType = SearchResultType.HISTORY print(result.resultTypeString) // "HISTORY"
quelle