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
propiedadesvar
yval
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.