Intereting Posts
Получить загрузчик классов generics для разбора вложенного поля Parcelable generic Использовать NumberFormat.getCurrency в Kotlin Android Эффективный коммутатор требует самокритики? Используется плагин kotlin-spring, все еще получающий класс не открытую ошибку Инициализация многопоточных массивов в Котлине Требовать сбой с номерами с плавающей точкой Kotlin – Характер подачи формы – Незаконный побег: '\ f' Ошибка встроенной функции компилятора Kotlin, не совсем уверенная, что происходит Невозможно создать класс объектов Android Room. генерации котлина в KFunction1 Как преобразовать объект LocalDateTime в строку ISO, включая часовой пояс? Учреждения в Котлине Обменный код между модульными испытаниями и контрольно-измерительными тестами при использовании котлина Почему я не могу добавить два номера в Котлин, используя этот исходный код? Как загрузить URL-адрес внутри WebView с помощью Android Kotlin?

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) 

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

Solutions Collecting From Web of "Kotlin: отображение неизменяемого списка в API"

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

 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() } } 

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