Kotlin: exponiendo list inmutable en API

Soy nuevo en Kotlin y estoy luchando con el problema de devolver versiones inmutables de lists internamente mutables.

Revisé el siguiente ' Kotlin: Modificar (inmutable) Lista a través del reparto, ¿es legítimo? 'y comprender que las lists inmutables son realmente solo vistas de solo lectura que no exponen los methods de modificación.

Quiero tener una class que exponga una list "inmutable" y aún quiera aprovechar los getters automáticos de Kotlins (sin tener que proporcionar todos los parameters para get la list o un miembro de la list)

Es lo siguiente una mala idea (o causará un problema que puede ser bloqueado en versiones futuras)

class Foo { val names: List<String> = LinkedList; fun addName(name: String) { (names as LinkedList).add(name) } } 

Estoy buscando para permitir (por ejemplo):

  val foo = Foo; println(foo.names.size) 

Pero aún evitará que la persona que llama modifique las partes internas de la class (al less tanto como sea posible). Por ejemplo, eliminar elementos o borrar la list de respaldo.

Los siguientes trabajos:

 class Foo { private val _names: MutableList<String> = mutableListOf() val names: List<String> get() = _names.toList() fun addName(name: String) { _names.add(name) } } 

El toList significa que si lo lanzan a MutableList<String> e intentan agregarlo obtendrán una UnsupportedOperationException , el campo _names contendrá los datos reales, y el acceso externo se realizará a través de la propiedad de nombres

Defina la list mutable como una propiedad privada con guión bajo (un tipo de "campo" en Kotlin) y exponga a través de otra propiedad pública de solo lectura.

Si el "campo" es de solo lectura, hará el truco (sugerido por @JWT):

 class Foo { private val _names: MutableList<String> = mutableListOf() val names: List<String> = _names fun addName(name: String) { _names.add(name) } } 

Si el "campo" puede ser reasignado, se requerirá definir getter como una function (note var _names ):

 class Foo2 { private var _names: MutableList<String> = mutableListOf() val names: List<String> get() = _names fun addName(name: String) { _names.add(name) } fun reset() { _names = mutableListOf() } } 

Las testings están disponibles aquí .

  • Cómo animar una list de animation en Kotlin?
  • Ocultar constructores por defecto de vista
  • Evite que Kotlin fuerce a Java a ver un tipo de comodín
  • Convierta la function de Scala a la function de Kotlin
  • ¿Cuál es el motivo de twitter4j.StreamListner IllegalAccessError en Kotlin?
  • sincronizar getters / setters de properties
  • Crear class extender AsyncTask sin fugas de objects de context en Android Kotlin
  • Función de extensión Kotlin en propiedad mutable
  • Declaración de object global en kotlin
  • Servicio no escrito en ShanetworkingPreferences
  • Kotlin + SpringBoot 2.0.0-M4 falló en el context de la aplicación de carga (BeanCreationException)