Les getters et les setters sont générés automatiquement dans Kotlin. Si vous écrivez:
val isEmpty: Boolean
Il est égal au code Java suivant:
private final Boolean isEmpty;
public Boolean isEmpty() {
return isEmpty;
}
Dans votre cas, le modificateur d'accès privé est redondant - isEmpty est privé par défaut et n'est accessible que par un getter. Lorsque vous essayez d'obtenir la propriété isEmpty de votre objet, vous appelez la méthode get en réel. Pour plus de compréhension des getters / setters dans Kotlin: les deux exemples de code ci-dessous sont égaux:
var someProperty: String = "defaultValue"
et
var someProperty: String = "defaultValue"
get() = field
set(value) { field = value }
Je tiens également à souligner que this
dans un getter n'est pas votre propriété - c'est l'instance de classe. Si vous souhaitez accéder à la valeur du champ dans un getter ou un setter, vous pouvez utiliser le mot réservé field
pour cela:
val isEmpty: Boolean
get() = field
Si vous souhaitez uniquement avoir une méthode get en accès public, vous pouvez écrire ce code:
var isEmpty: Boolean
private set
en raison du modificateur privé près de l'accesseur set, vous ne pouvez définir cette valeur que dans les méthodes de votre objet.
In your case the private access modifier is redundant
Comment? Le modificateur par défaut de Kotlin doc est public. kotlinlang.org/docs/reference/visibility-modifiers.htmlval isEmpty: Boolean
ne sera pas compilé car isEmpty n'est pas encore initialisé, non? Je commence juste à apprendre Kotlin. Aussi, que se passe-get() = field
t-il?val
's have no setterLes règles relatives aux modificateurs de visibilité des accesseurs de propriété sont les suivantes:
La visibilité Getter de
var
et de laval
propriété doit être exactement la même que la visibilité de la propriété, vous ne pouvez donc dupliquer explicitement que le modificateur de propriété, mais il est redondant:protected val x: Int protected get() = 0 // No need in `protected` here.
La visibilité de la
var
propriété par le poseur doit être la même ou moins permissive que la visibilité de la propriété:protected var x: Int get() = 0 private set(x: Int) { } // Only `private` and `protected` are allowed.
Dans Kotlin, les propriétés sont toujours accessibles via getter et setter, il n'est donc pas nécessaire de créer une propriété
private
avec despublic
accesseurs comme en Java - son champ de sauvegarde (s'il est présent) est déjà privé. Ainsi, les modificateurs de visibilité sur les accesseurs de propriété ne sont utilisés que pour rendre la visibilité du setter moins permissive:Pour une propriété avec un champ de sauvegarde et des accesseurs par défaut:
var x = 0 // `public` by default private set
Pour une propriété sans champ de support:
var x: Int // `public` by default get() = 0 protected set(value: Int) { }
la source
x
égal à certains"Some String"
et retour, disons la longueur,,11
de la chaîne?private
d'une variable, et il est devenu accessible à partir d'une autre classe avec getter.1) Exemple par défaut
setter
etgetter
pour la propriétéfirstName
dans Kotlinclass Person { var firstName: String = "" get() = field // field here ~ `this.firstName` in Java or normally `_firstName` is C# set(value) { field = value } }
En utilisant
val p = Person() p.firstName = "A" // access setter println(p.firstName) // access getter (output:A)
SI votre
setter
ougetter
est exactement le même ci-dessus, vous pouvez le supprimer car il n'est pas nécessaire2) Exemple de setter et getter personnalisés.
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") } } }
En utilisant
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
Plus
je commence à apprendre Kotlin à partir de Java, donc je suis confus
field
etproperty
parce qu'en Java il n'y en a pasproperty
.Après quelques recherches, je vois
field
etproperty
dans Kotlin ressemble à C # ( Quelle est la différence entre un champ et une propriété? )Voici quelques articles pertinents qui parlent de
field
etproperty
en Java et Kotlin.java a-t-il quelque chose de similaire aux propriétés C #?
https://blog.kotlin-academy.com/kotlin-programmer-dictionary-field-vs-property-30ab7ef70531
Corrigez-moi si je me trompe. J'espère que ça aide
la source
Getter dans kotlin est par défaut public, mais vous pouvez définir le setter sur private et définir la valeur en utilisant une méthode à l'intérieur d'une classe. Comme ça.
/** * 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}") }
la source
Vous pouvez voir ce tutoriel pour plus d'informations:
Encore un autre didacticiel Kotlin pour les développeurs Android
la source
Voici un exemple pratique et réel d'un getter et d'un setter Kotlin (voir plus de détails ici ):
// 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"
la source