Свойства из карты в Kotlin
Если данные уже лежат в Map, можно не копировать
их в отдельные поля: имя свойства становится ключом
карты. Запись val name: String by map читает
значение по ключу "name". Для var
запись в свойство обновляет карту - карта должна
быть изменяемой.
class User(map: Map<String, Any?>) {
val name: String by map
val age: Int by map
}
fun main() {
val data = mapOf(
"name" to "Ann",
"age" to 25,
)
val user = User(data)
println("${user.name} ${user.age}")
}
Тип свойства должен совпадать с типом значения
в карте, иначе при чтении будет ошибка приведения.
Для однородных данных удобнее
Map<String, String> или своя data class,
но паттерн с Map<String, Any?> часто встречается
в конфигах и JSON-подобных структурах.
class Settings(data: MutableMap<String, Any?>) {
var theme: String by data
var width: Int by data
}
fun main() {
val data = mutableMapOf<String, Any?>(
"theme" to "dark",
"width" to 800,
)
val s = Settings(data)
s.width = 1024
println(data["width"])
}
Объявите class Product(data: Map<String, Any?>)
со свойствами title и price через
by data. Для карты
mapOf("title" to "pen", "price" to 10)
выведите заголовок.
Объявите class Flags(store: MutableMap<String, Any?>)
с var active: Boolean by store.
Начальное значение в карте false.
Установите active = true и выведите
значение ключа "active" из той же карты.