Quiero que mi clase tenga un campo que devuelva una lista inmutable para todos los accesos públicos, pero dentro de la instancia del objeto quiero que la lista sea mutable para poder agregarle elementos.
class GrammarParser { private val grammars: List<Grammar> = mutableListOf() get() = field.toList() }
class GrammarParser { private val _grammars: MutableList<Grammar> = mutableListOf() val grammars: List<Grammar> get() = this._grammars.toList() }
Intenté esto, pero no estoy seguro de si esto se considera una buena práctica.
En Kotlin, cada MutableList<T>
también es una List<T>
. Por lo tanto, puede crear una MutableList
en un campo privado y declarar un campo adicional de tipo List
que apunte al mismo objeto. Dentro de la clase, puede usar la referencia mutable para modificar la lista y exponer la List
al exterior.
Ejemplo:
class GrammarParser { private val mutableGrammars = mutableListOf<Grammar>() val grammars: List<Grammar> = mutableGrammars }
En su segundo ejemplo, crea una copia (instantánea) de la lista cada vez que llama al captador. Esto significa que, después de llamar al getter y obtener una lista, incluso si _grammars
se modifica en otro lugar, los cambios no se reflejarán en la vista de lista de solo lectura de la que obtuvo la referencia. Esto podría ser algo que desea, entonces lo que está haciendo está bien. Pero si eso no es algo que está buscando, entonces el ejemplo que di arriba evitará la copia.