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?

36
demandé sur Willi Mentzel 2016-06-19 14:14:03

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.

68
répondu Cortwave 2016-06-24 01:07:14

les règles concernant Les accesseurs de propriété modificateurs de visibilité sont les suivantes:

  • Getter visibilité des var et val 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) { }
    
17
répondu hotkey 2016-06-19 17:52:12

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}")
}
4
répondu Lalit Behera 2017-06-26 09:37:33

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.

4
répondu Pluto65 2017-07-24 11:36:48

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

1
répondu Phan Van Linh 2018-07-15 14:50:15