142 votes

Getters et Setters de Kotlin

En Java, par exemple, je peux écrire des getters sur mon propre (généré par l'IDE) ou de l'utilisation des Annotations comme @Getter dans lombok - ce qui était assez simple.

Kotlin a cependant des 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 ne les accesseurs de travail?

221voto

Cortwave Points 2467

Les accesseurs et mutateurs sont auto-générés 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 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 plus de compréhension de 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 }

Aussi, je tiens à souligner qu' this dans un getter est pas votre propriété - c'est l'instance de classe. Si vous voulez avoir accès à la valeur du champ en un getter ou un setter vous pouvez utiliser le mot réservé field pour elle:

val isEmpty: Boolean
  get() = field

Si vous souhaitez seulement avoir une méthode d'obtenir dans le public d'accès: vous pouvez écrire ce code:

var isEmpty: Boolean
    private set 

en raison du 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.

38voto

hotkey Points 119

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

  • Getter visibilité de l' var et val de la 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.
    
  • Le Setter de la visibilité de l' var de la propriété doit être le même ou moins permissive que la propriété de la visibilité:

    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 par les méthodes getter et setter, donc il n'y a pas besoin d'en faire une propriété private avec public accesseurs comme en Java -- son champ de stockage (si présent) est déjà privé. Donc, modificateurs de visibilité sur les accesseurs de propriété ne sont utilisés que pour faire le setter de la visibilité à moins permissif:

  • 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) { }
    

28voto

Phan Van Linh Points 16963

1) Exemple par défaut setter et getter pour les biens 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
            }

}

À l'aide de

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 le supprimer car il est inutile

2) Exemple personnalisée setter et getter.

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")
            }
        }
}

À l'aide de

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
J'ai commencer à apprendre Kotlin de Java donc je suis confus au sujet de field et property parce qu'en Java il n'y a pas d' 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 post qui parle de field et property en Java et Kotlin.
java ont quelque chose de semblable à C# propriétés?
https://blog.kotlin-academy.com/kotlin-programmer-dictionary-field-vs-property-30ab7ef70531

Corrigez-moi si je me trompe. Espérons qu'il aidera

10voto

Lalit Behera Points 192

Getter dans kotlin est public par défaut, mais vous pouvez définir le setter privée et de définir la valeur à l'aide d'une méthode à l'intérieur d'une classe. Comme cette.

/**
* 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}")
}

6voto

Pluto65 Points 69

Vous pouvez voir ce tutoriel pour plus d'info:

Encore un Autre Kotlin Tutoriel 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 mot-clé 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 se passe derrière la les scènes. Nous allons aller à travers elle, étape par étape. Tout d'abord, nous avons créé un public final de Contact avec la classe.

C'est la première règle que nous avons à faire face à: si non spécifié autrement, les classes sont ouvertes au public et final par défaut (en passant, c'est la même pour les méthodes de la classe). Si vous souhaitez hériter de la classe, il marque avec de l'ouvrir mot-clé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X