Map-backed delegated properties let you store and access object properties using a map. This helps when you want flexible or dynamic property storage without writing many variables.
Map-backed delegated properties in Kotlin
import kotlin.reflect.KProperty class MapDelegate(val map: Map<String, Any?>) { operator fun <V> getValue(thisRef: Any?, property: KProperty<*>): V = (map[property.name] ?: error("No value for '${property.name}'")) as V } class MyClass(val map: Map<String, Any?>) { val prop: String by MapDelegate(map) }
The property is delegated to the map using by MapDelegate(map).
The map keys must match the property names exactly.
name and age from the map keys.import kotlin.reflect.KProperty class MapDelegate(val map: Map<String, Any?>) { operator fun <V> getValue(thisRef: Any?, property: KProperty<*>): V = (map[property.name] ?: error("No value for '${property.name}'")) as V } class User(val map: Map<String, Any?>) { val name: String by MapDelegate(map) val age: Int by MapDelegate(map) }
val userData = mapOf("name" to "Anna", "age" to 28) val user = User(userData) println(user.name) // prints Anna println(user.age) // prints 28
This program creates a Person class with properties delegated to a map. It prints the person's full name and age.
import kotlin.reflect.KProperty class MapDelegate(val map: Map<String, Any?>) { operator fun <V> getValue(thisRef: Any?, property: KProperty<*>): V = (map[property.name] ?: error("No value for '${property.name}'")) as V } class Person(val map: Map<String, Any?>) { val firstName: String by MapDelegate(map) val lastName: String by MapDelegate(map) val age: Int by MapDelegate(map) } fun main() { val data = mapOf("firstName" to "John", "lastName" to "Doe", "age" to 30) val person = Person(data) println("Name: ${person.firstName} ${person.lastName}") println("Age: ${person.age}") }
If the map does not contain a key matching the property name, the program will throw an exception.
Map-backed properties are read-only by default. To make them mutable, you need a MutableMap and use var with delegation.
Map-backed delegated properties let you link class properties to map entries easily.
This reduces boilerplate when working with dynamic or flexible data.
Property names must match map keys exactly for this to work.
Practice
Map-backed delegated properties in Kotlin?Solution
Step 1: Understand the concept of map-backed delegation
Map-backed delegated properties allow class properties to get and set values directly from a map using the property name as the key.Step 2: Identify the main purpose
This reduces boilerplate code when working with dynamic data by linking properties to map entries.Final Answer:
To link class properties directly to entries in a map -> Option BQuick Check:
Map-backed delegation links properties to map keys [OK]
- Thinking it creates immutable lists
- Assuming it converts maps to JSON
- Confusing it with arithmetic operations on maps
name delegated to a map map in Kotlin?Solution
Step 1: Recall the syntax for map-backed delegated properties
In Kotlin, you delegate a property to a map usingval property by map, where the property name matches the map key.Step 2: Analyze each option
val name by map uses the correct syntax. val name by map["name"] tries to delegate to a map entry, which is invalid. val name by map.get("name") calls a function, not delegation. val name = map["name"] just assigns the value, not delegation.Final Answer:
val name by map -> Option DQuick Check:
Property delegation uses 'by map' syntax [OK]
- Trying to delegate to map entry like map["key"]
- Using map.get() instead of delegation
- Assigning value directly without delegation
class User(val map: Map<String, Any?>) {
val name: String by map
val age: Int by map
}
fun main() {
val user = User(mapOf("name" to "Alice", "age" to 30))
println("Name: ${user.name}, Age: ${user.age}")
}Solution
Step 1: Understand map-backed delegation behavior
The propertiesnameandagedelegate to the map keys "name" and "age" respectively, retrieving their values.Step 2: Check the map contents and output
The map contains "name" as "Alice" and "age" as 30, so printing these properties outputs "Name: Alice, Age: 30".Final Answer:
Name: Alice, Age: 30 -> Option AQuick Check:
Map keys match properties, so values print correctly [OK]
- Expecting null or default values
- Confusing delegation with direct assignment
- Assuming runtime error without missing keys
class Person(val map: Map<String, Any>) {
val firstName: String by map
val lastName: String by map
}
fun main() {
val data = mapOf("firstName" to "John")
val person = Person(data)
println(person.lastName)
}Solution
Step 1: Check map keys vs delegated properties
The map contains only "firstName", but the class expects both "firstName" and "lastName" keys for delegation.Step 2: Understand behavior on missing keys
Accessingperson.lastNametries to get a missing key, causing a runtime exception (NoSuchElementException).Final Answer:
Runtime exception due to missing key "lastName" in map -> Option CQuick Check:
Missing map keys cause runtime errors [OK]
- Assuming missing keys return null
- Thinking it's a compile-time error
- Ignoring runtime exceptions on missing keys
data = mapOf("x" to 10, "y" to 20, "z" to 0), how can you create a Kotlin class Point with map-backed delegated properties x, y, and z but only expose x and y publicly, hiding z internally?Solution
Step 1: Understand visibility modifiers in Kotlin
Properties can be declared withprivateto hide them from outside the class.Step 2: Apply visibility to map-backed properties
Declarexandyas public (default) andzasprivate val z: Int by mapto hide it internally.Final Answer:
Declare val x: Int by map, val y: Int by map as public and private val z: Int by map -> Option AQuick Check:
Use 'private' modifier to hide delegated properties [OK]
- Assuming all properties are public by default
- Trying to exclude keys from the map instead of hiding
- Confusing var and val for visibility
Ready to prove it?
Pass the test and this pattern moves unknown
