variable and kotlin getter-setter

and - Getters y Setters en Kotlin



set kotlin (5)

1) Ejemplo de setter y getter predeterminados 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 } }

Utilizando

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

SI su setter o getter está exactamente igual arriba, puede eliminarlo porque es innecesario

2) Ejemplo de 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") } } }

Utilizando

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
Comienzo a aprender Kotlin de Java, así que estoy confundido sobre el field y la property porque en Java no hay property .
Después de una búsqueda, veo que el field y la property en Kotlin se parecen a C # ( ¿Cuál es la diferencia entre un campo y una propiedad? )

Aquí hay una publicación relevante que habla sobre el field y la property en Java y Kotlin.
¿Java tiene algo similar a las propiedades de C #?
https://blog.kotlin-academy.com/kotlin-programmer-dictionary-field-vs-property-30ab7ef70531

Corrígeme si estoy equivocado. Espero que ayude

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

Sin embargo, Kotlin tiene captadores y establecedores 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 captadores?


Getter en kotlin es público de forma predeterminada, pero puede establecer el setter en privado y establecer el valor utilizando un método dentro de una clase. Me gusta esto.

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


Getters y setters se generan automáticamente en Kotlin. Si tú 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 de forma predeterminada y solo un getter puede acceder a él. Cuando intentas obtener la propiedad isEmpty de tu objeto, llamas al método get en real. Para una mejor 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 de su propiedad, es la instancia de clase. Si desea obtener acceso al valor del campo en un captador o definidor, puede usar el field palabra reservado para él:

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 conjunto de acceso, puede establecer este valor solo en métodos dentro de su objeto.


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

  • La visibilidad del val propiedades var y val debe ser exactamente igual a la visibilidad de la propiedad, por lo que solo puede duplicar explícitamente el modificador de propiedad, pero es redundante:

    protected val x: Int protected get() = 0 // No need in `protected` here.

  • La visibilidad de Setter de la propiedad var debe ser igual o menos permisiva que la visibilidad de la propiedad:

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

En Kotlin, siempre se accede a las propiedades a través de getter y setter, por lo que no es necesario hacer que una propiedad sea private con accesores public 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 setter sea menos permisiva:

  • Para una propiedad con campo de respaldo y accesos 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) { }


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

Otro tutorial de Kotlin para desarrolladores de Android

Propiedades

En el mundo de Kotlin, las clases no pueden tener campos, solo propiedades. La palabra clave var nos dice que la propiedad es mutable, en contraste con val. Veamos 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 están sucediendo muchas cosas detrás de escena. Lo veremos paso a paso. En primer lugar, creamos un contacto público de clase final.

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 los métodos de clase). Si desea heredar de la clase, márquelo con la palabra clave abierta.