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 corregir la firma del método de extensión genérico en kotlin para resolver "Falló la inferencia de tipo" en kotlin
  • Obtener una URL en Android Kotlin de forma asíncrona
  • ¿Cómo get un KType en Kotlin?
  • Cómo get un package de kotlin por reflexión
  • Cómo pasar funciones para funcionar en Kotlin
  • Explicar esta estructura de function de Kotlin
  • Android Kotlin: no se puede progtwigr la notificación para una date futura con el administrador de alarmas
  • Visibilidad de Kotlin de los miembros nesteds
  • ¿Cómo agrego una barra de herramientas a Android PreferenceActivity cuando NoActionBar está configurado como el tema de la aplicación?
  • Sitio de Android con RxJava manejar resultado de consulta vacío
  • Matriz multidimensional '3D' en Kotlin