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?
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.
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
andval
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) { }
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}")
}
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.
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
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