web-dev-qa-db-fra.com

Getters et Setters à Kotlin

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?

57
alexey polusov

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.

97
Cortwave

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) { }
    
25
hotkey

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}")
}
6
Lalit Behera

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.

4
Pluto65

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

4
Phan Van Linh