Getters y Setters en Kotlin


En Java, por ejemplo, puedo escribir getters por mi cuenta (generados por IDE) o usar Anotaciones como @Getter en lombok, lo cual era bastante simple.

Kotlin sin embargo tiene getters y setters por defecto. Pero no puedo entender cómo usarlos.

Quiero hacerlo, digamos - similar a Java:

private val isEmpty: String
        get() = this.toString() //making this thing public rises an error: Getter visibility must be the same as property visibility.

Entonces, ¿cómo funcionan los getters?

Author: Willi Mentzel, 2016-06-19

5 answers

Los getters y setters se generan automáticamente en Kotlin. Si escribes:

val isEmpty: Boolean

Es igual al siguiente código Java:

private final Boolean isEmpty;

public Boolean isEmpty() {
    return isEmpty;
}

En su caso el modificador de acceso privado es redundante - isEmpty es privado por defecto y solo se puede acceder por un getter. Cuando intenta obtener la propiedad isEmpty de su objeto, llama al método get en real. Para una mayor comprensión de getters/setters en Kotlin: los dos ejemplos de código a continuación son iguales:

var someProperty: String = "defaultValue"

Y

var someProperty: String = "defaultValue"
    get() = field
    set(value) { field = value }

También quiero señalar que this en un getter no es su propiedad - es la instancia de clase. Si desea obtener acceso al valor del campo en un getter o setter, puede usar la palabra reservada field para ello:

val isEmpty: Boolean
  get() = field

Si solo desea tener un método get en acceso público, puede escribir este código:

var isEmpty: Boolean
    private set 

Debido al modificador privado cerca del accessor set, puede establecer este valor solo en métodos dentro de su objeto.

 68
Author: Cortwave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-24 01:07:14

Las reglas sobre los accesores de propiedad modificadores de visibilidad son las siguientes:

  • Getter visibility of var and val property should be exactly the same to the visibility of the property, thus you can only explicitly duplicate the property modifier, but it is redundant: {[12]]}

    protected val x: Int
        protected get() = 0 // No need in `protected` here.
    
  • La visibilidad del Setter de la propiedad var debe ser la misma o menos permisiva que la propiedad visibilidad:

    protected var x: Int
        get() = 0
        private set(x: Int) { } // Only `private` and `protected` are allowed.
    

En Kotlin, las propiedades siempre se acceden a través de getter y setter, por lo que no hay necesidad de hacer una propiedad private con public accesores como en Java {su campo de respaldo (si está presente) ya es privado. Por lo tanto, los modificadores de visibilidad en los accesores de propiedad solo se usan para hacer que la visibilidad del configurador sea menos permisiva:

  • Para una propiedad con campo de respaldo y accesores predeterminados:

    var x = 0 // `public` by default
        private set
    
  • Para una propiedad sin campo de respaldo:

    var x: Int // `public` by default
        get() = 0
        protected set(value: Int) { }
    
 17
Author: hotkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-19 17:52:12

Getter en kotlin es por defecto público, pero puede establecer el setter en privado y establecer el valor mediante el uso de un método dentro de una clase. Así.

/**
* 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
Author: Lalit Behera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-26 09:37:33

Puedes ver este tutorial para más información:

Otro tutorial de Kotlin para Desarrolladores de Android

Propiedades

En Kotlin world, las clases no pueden tener campos, solo propiedades. var la palabra clave nos dice que la propiedad es mutable, en contraste con val. Vamos ver un ejemplo:

class Contact(var number: String) {

   var firstName: String? = null
   var lastName: String? = null
   private val hasPrefix : Boolean
       get() = number.startsWith("+")

}

No Hay mucho código, pero muchas cosas están sucediendo detrás de la escena. Vamos a ir a través de él paso a paso. En primer lugar, creamos un publico último Contacto de clase.

Esta es la regla principal que tenemos que enfrentar: si no se especifica lo contrario, las clases son públicas y finales por defecto (por cierto, lo mismo es para métodos de clase). Si desea heredar de la clase, márquelo con open palabra clave.

 4
Author: Pluto65,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-24 11:36:48

1) Ejemplo predeterminado setter y getter para la propiedad firstName en Kotlin

class Person {
    var firstName: String = ""
            get() = field       // field here ~ `this.firstName` in Java or normally `_firstName` is C#
            set(value) {
                field = value
            }

}

Usando

val p = Person()
p.firstName = "A"  // access setter
println(p.firstName) // access getter (output:A)

SI su setter o getter es exactamente el mismo anteriormente, puede quitar porque es innecesarios

2) Ejemplo setter y getter personalizados.

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

Usando

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

Más
Empiezo a aprender Kotlin desde Java, así que estoy confundiendo field y property porque en Java no hay property.
Despues algunas búsquedas, veo field y property en Kotlin parecen C# ( ¿Cuál es la diferencia entre un campo y una propiedad?)

Aquí hay algunos post relevantes que hablan de field y property en Java y Kotlin.
java tiene algo similar a C# properties?
https://blog.kotlin-academy.com/kotlin-programmer-dictionary-field-vs-property-30ab7ef70531

Corrígeme si estoy equivocado. Espero que ayude

 1
Author: Phan Van Linh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-15 14:50:15