Явное поле в Kotlin
Свойство класса обычно описывают одной строкой с типом, который видят все вызовы. Иногда внутри класса удобнее держать другую конкретную реализацию - например, изменяемый список, а наружу отдавать только чтение.
В Kotlin 2.4 для этого служит блок field после
объявления свойства. Тип в заголовке остается для
внешнего мира, а после field = задается
реальное хранилище:
class Cart {
val titles: List<String>
field = mutableListOf<String>()
fun add(title: String) {
titles.add(title)
}
}
Снаружи titles имеет тип List<String>.
Внутри метод add работает с изменяемым
списком, потому что компилятор знает фактическое
поле. Собственный getter при явном поле не пишут -
доступ идет напрямую к хранилищу:
class Cart {
val titles: List<String>
field = mutableListOf<String>()
fun add(title: String) {
titles.add(title)
}
}
fun main() {
val cart = Cart()
cart.add("pen")
cart.add("book")
println(cart.titles.size)
}
Тот же прием подходит, когда нужно накопить элементы в процессе работы объекта, но не раскрывать наружу изменяемую коллекцию:
class TagSet {
val tags: Set<String>
field = mutableSetOf<String>()
fun remember(tag: String) {
tags.add(tag)
}
}
fun main() {
val set = TagSet()
set.remember("draft")
println(set.tags.contains("draft"))
}
Сделайте класс журнала с свойством строк только для чтения снаружи и изменяемым списком внутри через явное поле. Добавьте две записи и выведите их число.
Сделайте класс с множеством меток: снаружи тип
неизменяемого множества, внутри - изменяемое
хранилище. Добавьте метку "beta" и
проверьте, что она есть в наборе.