Getters et Setters à Kotlin
en Java, par exemple, je peux écrire des getters moi - même (généré par IDE) ou utiliser des Annotations comme @Getter dans lombok-ce qui était assez simple.
Kotlin a cependant getters et setters par défaut . Mais je ne peux pas comprendre comment les utiliser.
je veux le faire, disons - similaire à Java:
private val isEmpty: String
get() = this.toString() //making this thing public rises an error: Getter visibility must be the same as property visibility.
alors comment fonctionnent les getters?
5 réponses
Getters et setters sont générés automatiquement à Kotlin. Si vous écrivez:
val isEmpty: Boolean
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 peut être consulté que par un getter. Lorsque vous essayez d'obtenir votre objet isEmpty propriété vous appelez la méthode get dans le réel. Pour une meilleure compréhension des getters / setters à Kotlin: les deux exemples de code ci-dessous sont égal:
var someProperty: String = "defaultValue"
et
var someProperty: String = "defaultValue"
get() = field
set(value) { field = value }
aussi je tiens à souligner que this
dans un getter n'est pas votre propriété - c'est l'instance de classe. Si vous voulez 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 voulez seulement avoir une méthode get en accès public - vous pouvez écrire ce code:
var isEmpty: Boolean
private set
en raison de la privé modificateur près de l'accesseur set vous pouvez définir cette valeur uniquement dans les méthodes à l'intérieur de votre objet.
les règles concernant Les accesseurs de propriété modificateurs de visibilité sont les suivantes:
-
Getter visibilité des
var
etval
propriété doit être exactement le même pour la visibilité de la propriété, donc vous ne pouvez explicitement dupliquer la propriété modificateur, mais c'est redondant:protected val x: Int protected get() = 0 // No need in `protected` here.
-
Setter visibilité de
var
propriété doit être la même ou moins permissive que la propriété visibilité:protected var x: Int get() = 0 private set(x: Int) { } // Only `private` and `protected` are allowed.
à Kotlin, les propriétés sont toujours accessibles par getter et setter, donc il n'y a pas besoin de faire une propriété private
avec public
accesseurs comme en Java -- son champ de soutien (si présent) est déjà privé. Donc, modificateurs de visibilité sur les accesseurs de propriété ne sont utilisé pour rendre la visibilité du setter moins permissive:
-
Pour une propriété de champ de stockage par défaut et les accesseurs:
var x = 0 // `public` by default private set
-
Pour une propriété sans la sauvegarde de champ:
var x: Int // `public` by default get() = 0 protected set(value: Int) { }
Getter dans kotlin est par défaut public, mais vous pouvez définir le setter à private et définir la valeur en utilisant une méthode à l'intérieur d'une classe. Pareil.
/**
* 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}")
}
vous pouvez voir ce tutoriel pour plus d'informations:
encore un autre tutoriel de Kotlin pour les développeurs Android
propriétés
Dans Kotlin monde, les classes ne peuvent pas avoir de champs, seulement des propriétés. var keyword nous dit que la propriété est mutable, contrairement à val. Nous allons voir un exemple:
class Contact(var number: String) { var firstName: String? = null var lastName: String? = null private val hasPrefix : Boolean get() = number.startsWith("+") }
Il n'y a pas beaucoup de code, mais beaucoup de choses sont qui se passe derrière la scènes. nous allons passer par elle étape par étape. Tout d'abord, nous avons créé un public final de Contact avec la classe.
C'est la règle principale à laquelle nous devons faire face: si non spécifié autrement, les classes sont publiques et finales par défaut (soit dit en passant, la même chose est pour les méthodes de la classe). Si vous voulez hériter de la classe, marquez-le avec Ouvert mot.
1) Exemple de défaut setter
et getter
pour propriété firstName
in Kotlin
class Person {
var firstName: String = ""
get() = field // field here ~ `this.firstName` in Java or normally `_firstName` is C#
set(value) {
field = value
}
}
utilisant
val p = Person()
p.firstName = "A" // access setter
println(p.firstName) // access getter (output:A)
si votre setter
ou getter
est exactement le même ci-dessus, vous pouvez l'enlever parce qu'il est inutile
2) 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")
}
}
}
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 le Kotlin de Java donc je suis confus au sujet de field
et property
parce que dans Java il n'y a pas de property
.
Après quelques recherches, je vois field
et property
dans Kotlin ressembler à C# ( Quelle est la différence entre un champ et une propriété? )
Voici quelques billets pertinents qui parlent de field
et property
en Java et Kotlin.
est-ce que java a 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. Espérons qu'il aide