En Java, par exemple, je peux écrire moi-même des accesseurs (générés par IDE) ou utiliser des annotations comme @Getter in lombok - ce qui était assez simple.
Kotlin a cependant getters et setters par défaut . Mais je ne comprends pas comment les utiliser.
Je veux le faire, disons - semblable à 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?
Les accesseurs 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 une meilleure compréhension des getters/setters de 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 }
De plus, je tiens à souligner que this
dans un getter n'est pas votre propriété - c'est l'instance de la classe. Si vous voulez avoir accès à la valeur du champ dans un getter ou un setter, vous pouvez utiliser le mot réservé field
:
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 du modificateur private près de l'accesseur set, vous pouvez définir cette valeur uniquement dans les méthodes de votre objet.
Les règles concernant les accesseurs de propriétés modificateurs de visibilité sont les suivantes:
La visibilité Getter de la propriété var
et val
doit être exactement identique à la visibilité de la propriété; vous ne pouvez donc qu'explicitement dupliquez le modificateur de propriété, mais il est redondant:
protected val x: Int
protected get() = 0 // No need in `protected` here.
La visibilité de curseur de la propriété var
devrait être identique 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 public
accesseurs comme dans Java - son champ de sauvegarde (si 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 sélecteur 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 arrière-champ:
var x: Int // `public` by default
get() = 0
protected set(value: Int) { }
Getter dans kotlin est public par défaut, mais vous pouvez définir le sélecteur sur privé et définir la valeur à l'aide d'une méthode dans 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}")
}
Vous pouvez voir ce tutoriel pour plus d'informations:
Encore un didacticiel Kotlin pour Android Développeurs
Propriétés
Dans le monde Kotlin, les classes ne peuvent pas avoir de champs, juste des propriétés. Le mot-clé var nous indique que la propriété est modifiable, contrairement à val. Voyons 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 se passent dans les coulisses. Nous allons le parcourir étape par étape. Tout d’abord, nous avons créé un contact final de classe publique.
C’est la règle principale à laquelle nous devons faire face: sauf indication contraire, les classes sont publiques et finales par défaut (d’ailleurs, il en va de même pour les méthodes de classe). Si vous voulez hériter de la classe, marquez-la avec le mot clé open.
1) Exemple par défaut setter
et getter
pour la propriété firstName
dans Kotlin
class 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
ou getter
est exactement identique ci-dessus, vous pouvez le supprimer car il est inutile
2) Exemple de poseur et de getter personnalisé.
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 déroutant à propos de field
et property
car 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 un article pertinent qui parle de field
et property
dans Java et de 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