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í .

  • Analizando json con API remota rota
  • Información de Facebook no se muestra
  • ¿Cómo puedo enmascarar una contraseña con Anko?
  • ¿Puedo usar la inyección de campo de Dagger 2 en Kotlin?
  • Cómo importar packages Java en Kotlin Native
  • Android Dagger 2.11 con Kotlin, problema de publicación de ContributesAndroidInjector
  • Argumentos no utilizados al destruir un object en Kotlin
  • método getter arrojando StackOverflowError
  • ArgumentCaptor capture regresa nulo
  • ¿Puedo actualizar un object inmutable profundamente nested sin tomar conciencia de su context?
  • Procesamiento de annotations de Kotlin: ¿es posible generar un método de extensión?