Kotlin: отображение неизменяемого списка в API

Я новичок в Kotlin и борюсь с проблемой возвращения неизменных версий внутренне изменяемых списков.

Я рассмотрел следующий « Kotlin: Модифицирующий (неизменный) список через листинг, это законно? »и понять, что неизменяемые списки – это просто точки зрения только для чтения, которые не раскрывают методы модификации.

Я хочу иметь класс, который предоставляет «неизменный» список и все еще хочет использовать автоматические геттеры Kotlins (без необходимости предоставлять весь шаблон для получения списка или члена списка)

Является ли следующая плохая идея (или это вызовет проблему, которая может быть заблокирована в будущих выпусках)

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

Я хочу разрешить (например):

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

Но все же запретить вызывающему абоненту изменять внутренние элементы класса (по крайней мере, насколько это возможно). Например, удаление элементов или очистка списка поддержки.

Следующие работы:

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

ToList означает, что если они MutableList<String> его в MutableList<String> и пытаются добавить к нему, они получат UnsupportedOperationException , поле _names содержит реальные данные, а внешний доступ выполняется через свойство names

Определить изменяемый список как частное свойство с подчеркиванием (своеобразным «полем» в Котлине) и разоблачить его через другое публичное свойство только для чтения.

Если «поле» доступно только для чтения, это сделает трюк (предложенный @JWT):

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

Если «поле» может быть переназначено, ему потребуется определить getter как функцию (обратите внимание на 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() } } 

Тесты доступны здесь .

Intereting Posts
Класс не найден в модуле Почему потоки показывают лучшую производительность, чем сопрограммы? Как сделать вывод типа Котлин из отражения KClass? Динамическая оценка шаблонных строк в Котлине Как интегрировать расширенные рекламные объявления Admob с помощью Kotlin – Android как перебирать Single <List> и отображать в другой список? Ошибка сегментации Android Emulator 6824 KOTLIN orphanRemoval не работает Объявление пользовательской «чистой» задачи при использовании стандартных плагинов жизненного цикла Gradle запрещено JOOQ с Gradle и Kotlin не генерируют файлы Почему существует NoClassDefFoundError с классом, который существует? Как инициализировать два конструктора в котлин с внутренним классом? Как объединить 2 отдельных потока, буферизовать заполненные данные из них и subsrcibe к нему после некоторого времени Найти аннотации в проекте Kotlin / Groovy в плагине IDEA Как решить KaptError: ошибка при обработке аннотаций в Android Studio 3.0?