Getters y Setters en Kotlin

En Java, por ejemplo, puedo escribir getters por mi count (generado por IDE) o usar Annotations como @Getter en lombok, lo cual es 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?

Getters y setters se generan automáticamente en Kotlin. Si tú escribes:

 val isEmpty: Boolean 

Es igual al siguiente código de Java:

 private final Boolean isEmpty; public Boolean isEmpty() { return isEmpty; } 

En su caso, el modificador de acceso privado es networkingundante: isEmpty es privado por defecto y solo puede accederse mediante un getter. Cuando intenta get la propiedad de object es Vacío, llama al método get en real. Para get más información sobre 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 class. Si desea get acceso al valor del campo en un getter o setter, puede usar el field palabra reservada 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 acceso de configuration, puede establecer este valor solo en methods dentro de su object.

Las reglas sobre los modificadores de visibilidad de los descriptores de acceso a properties son las siguientes:

  • La visibilidad de Getter de la propiedad var y val debería ser exactamente igual a la visibilidad de la propiedad, por lo que solo se puede duplicar explícitamente el modificador de propiedad, pero es networkingundante:

     protected val x: Int protected get() = 0 // No need in `protected` here. 
  • La visibilidad de setter de la propiedad var debe ser la misma o less 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, las properties siempre se acceden a través de getter y setter, por lo tanto, no es necesario hacer una propiedad private con acceso public como en Java: su campo de respaldo (si está presente) ya es privado. Por lo tanto, los modificadores de visibilidad en los descriptores de acceso a las properties solo se usan para que la visibilidad del colocador sea less permisiva:

  • Para una propiedad con campo de respaldo y accesadores pnetworkingeterminados:

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

Getter in kotlin es por defecto público, pero puede establecer el setter en privado y establecer el valor utilizando un método dentro de una class. 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}") } 

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

Otro tutorial de Kotlin para desarrolladores de Android

Propiedades

En el mundo de Kotlin, las classs no pueden tener campos, solo properties. La palabra key var nos dice que la propiedad es mutable, a diferencia de 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 muchas cosas están sucediendo detrás de escena. Vamos a ir paso a paso. En primer lugar, creamos un contacto público de class final.

Esta es la regla principal a la que nos enfrentamos: si no se especifica lo contrario, las classs son públicas y finales por defecto (por cierto, lo mismo es para los methods de class). Si desea henetworkingar de la class, márquelo con una palabra key abierta.

  • ¿Cómo declaras un campo polimórfico que usa JsonTypeInfo.As.WRAPPER_OBJECT con Jackson XML?
  • ¿Cuál es el equivalente de Kotlin de Java Stream.collect?
  • Igualdad en Kotlin
  • ¿Qué es un module de Kotlin?
  • Corda: error = org.hibernate.InstantiationException: ningún constructor pnetworkingeterminado para la entidad
  • Función Kotlin Call Javascript en Android sin webView
  • Cómo desestructurar objects Kotlin en streams
  • Evite que Kotlin fuerce a Java a ver un tipo de comodín
  • No puedo permitir que mi aplicación use el permiso dibujar sobre otras aplicaciones
  • Las classs de Kotlin que contienen android-extensiones no se basan en construcciones consecuentes
  • Constructor llama a kotlin usando vararg