📖 Scenario: You are creating a simple user profile system where user details are stored in a map. You want to access these details as properties of a Kotlin class using map-backed delegated properties.
🎯 Goal: Build a Kotlin class UserProfile that uses a Map to store user data and access it through delegated properties.
📋 What You'll Learn
Create a Map with user data including "name", "age", and "email".
Create a UserProfile class that takes the map as a constructor parameter.
Use map-backed delegated properties to access name, age, and email inside UserProfile.
Print the values of name, age, and email from an instance of UserProfile.
💡 Why This Matters
🌍 Real World
Map-backed delegated properties are useful when you want to store data in a flexible map but access it like normal class properties, such as in configuration settings or user profiles.
💼 Career
Understanding delegated properties and map usage is valuable for Kotlin developers working on Android apps or backend services where dynamic data structures are common.
Progress0 / 4 steps
1
Create the user data map
Create a Map called userData with these exact entries: "name" to "Alice", "age" to 30, and "email" to "alice@example.com".
Kotlin
Hint
Use mapOf to create a map with keys and values.
2
Create the UserProfile class with map parameter
Create a class called UserProfile that takes a Map<String, Any> parameter called data in its primary constructor.
Kotlin
Hint
Define a class with a primary constructor that takes a map parameter.
3
Add map-backed delegated properties
Inside the UserProfile class, add three properties: name, age, and email. Use by data to delegate these properties to the data map.
Kotlin
Hint
Use val propertyName: Type by data syntax for map-backed delegation.
4
Create UserProfile instance and print properties
Create an instance of UserProfile called user using userData. Then print user.name, user.age, and user.email each on a new line.
Kotlin
Hint
Create the UserProfile instance and use println to show each property.
Practice
(1/5)
1. What is the main purpose of using Map-backed delegated properties in Kotlin?
easy
A. To convert maps into JSON strings automatically
B. To link class properties directly to entries in a map
C. To perform arithmetic operations on map values
D. To create immutable lists easily
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 B
Quick Check:
Map-backed delegation links properties to map keys [OK]
Hint: Remember: properties match map keys exactly [OK]
Common Mistakes:
Thinking it creates immutable lists
Assuming it converts maps to JSON
Confusing it with arithmetic operations on maps
2. Which of the following is the correct syntax to declare a property name delegated to a map map in Kotlin?
easy
A. val name by map["name"]
B. val name = map["name"]
C. val name by map.get("name")
D. val name by map
Solution
Step 1: Recall the syntax for map-backed delegated properties
In Kotlin, you delegate a property to a map using val 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 D
Quick Check:
Property delegation uses 'by map' syntax [OK]
Hint: Use 'by map' with property name matching key [OK]
Common Mistakes:
Trying to delegate to map entry like map["key"]
Using map.get() instead of delegation
Assigning value directly without delegation
3. What will be the output of the following Kotlin code?
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}")
}
medium
A. Name: Alice, Age: 30
B. Name: null, Age: 0
C. Compilation error due to type mismatch
D. Runtime exception due to missing keys
Solution
Step 1: Understand map-backed delegation behavior
The properties name and age delegate 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 A
Quick Check:
Map keys match properties, so values print correctly [OK]
Hint: Property names must match map keys exactly [OK]
Common Mistakes:
Expecting null or default values
Confusing delegation with direct assignment
Assuming runtime error without missing keys
4. Identify the error in this Kotlin code using map-backed delegated properties:
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)
}
medium
A. No error; prints null for missing key
B. Compilation error because map type is incorrect
C. Runtime exception due to missing key "lastName" in map
D. Syntax error in property delegation
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
Accessing person.lastName tries to get a missing key, causing a runtime exception (NoSuchElementException).
Final Answer:
Runtime exception due to missing key "lastName" in map -> Option C
Quick Check:
Missing map keys cause runtime errors [OK]
Hint: All delegated keys must exist in the map [OK]
Common Mistakes:
Assuming missing keys return null
Thinking it's a compile-time error
Ignoring runtime exceptions on missing keys
5. Given a map 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?
hard
A. Declare val x: Int by map, val y: Int by map as public and private val z: Int by map
B. Declare all properties as val without visibility modifiers
C. Use var for z and val for others
D. Exclude z from the map passed to the class
Solution
Step 1: Understand visibility modifiers in Kotlin
Properties can be declared with private to hide them from outside the class.
Step 2: Apply visibility to map-backed properties
Declare x and y as public (default) and z as private val z: Int by map to 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 A
Quick Check:
Use 'private' modifier to hide delegated properties [OK]
Hint: Use 'private' keyword to hide properties [OK]
Common Mistakes:
Assuming all properties are public by default
Trying to exclude keys from the map instead of hiding
Confusing var and val for visibility
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.