📖 Scenario: You are building a simple Kotlin program to manage a user's profile settings. You want to control how certain properties behave when accessed or changed.
🎯 Goal: Create a custom delegated property that logs every time a property is read or written. Then use this delegate for a user's name property.
📋 What You'll Learn
Create a class called LoggingDelegate that implements the getValue and setValue operator functions.
The delegate should print a message when the property is read and when it is written.
Create a class called User with a property name that uses LoggingDelegate.
Create an instance of User, set the name property, then read it and print the value.
💡 Why This Matters
🌍 Real World
Custom delegated properties help manage how data is accessed or changed, useful in settings, caching, or validation.
💼 Career
Understanding Kotlin delegates is valuable for Android developers and Kotlin backend developers to write clean, reusable, and maintainable code.
Progress0 / 4 steps
1
Create the LoggingDelegate class
Create a class called LoggingDelegate with a mutable property value of type String initialized to an empty string.
Kotlin
Hint
Use var value: String = "" inside the class to hold the property value.
2
Add getValue and setValue operator functions
Inside the LoggingDelegate class, add the operator fun getValue and operator fun setValue functions. In getValue, print "Getting value" and return value. In setValue, print "Setting value to" followed by the new value, then update value.
Kotlin
Hint
Remember to use operator fun getValue(thisRef: Any?, property: KProperty<*>) and operator fun setValue(thisRef: Any?, property: KProperty<*>, newValue: String).
3
Create User class with name property using delegate
Create a class called User with a property name of type String that uses LoggingDelegate() as its delegate.
Kotlin
Hint
Use var name: String by LoggingDelegate() inside the User class.
4
Create User instance, set and get name, then print it
Create a variable user as an instance of User. Set user.name to "Alice". Then print user.name.
Kotlin
Hint
Remember to create val user = User(), then user.name = "Alice", and finally println(user.name).
Practice
(1/5)
1. What is the main purpose of using custom delegated properties in Kotlin?
easy
A. To define extension functions for a class
B. To create multiple constructors for a class
C. To control how a property's value is stored and retrieved
D. To override the default toString() method
Solution
Step 1: Understand property delegation concept
Delegated properties let you customize how a property's value is handled behind the scenes.
Step 2: Identify the purpose of custom delegation
Custom delegated properties specifically allow control over getting and setting property values.
Final Answer:
To control how a property's value is stored and retrieved -> Option C
2. Which of the following is the correct syntax to declare a custom delegated property in Kotlin?
easy
A. val prop = Delegate()
B. val prop by Delegate()
C. val prop: Delegate by this
D. val prop delegate Delegate()
Solution
Step 1: Recall Kotlin delegation syntax
Delegated properties use the by keyword followed by a delegate instance.
Step 2: Match correct syntax
val prop by Delegate() correctly declares a delegated property.
Final Answer:
val prop by Delegate() -> Option B
Quick Check:
Delegation uses 'by' keyword [OK]
Hint: Look for 'by' keyword with delegate instance [OK]
Common Mistakes:
Using '=' instead of 'by' for delegation
Incorrect delegate type declaration
Missing parentheses for delegate constructor
3. What will be the output of the following Kotlin code?
class Delegate {
operator fun getValue(thisRef: Any?, property: kotlin.reflect.KProperty<*>): String {
return "Hello from delegate"
}
}
class Example {
val message: String by Delegate()
}
fun main() {
val e = Example()
println(e.message)
}
medium
A. Hello from delegate
B. null
C. Compilation error
D. Hello from Example
Solution
Step 1: Understand getValue operator
The getValue function returns the string "Hello from delegate" when the property is accessed.
Step 2: Trace property access in main()
Accessing e.message calls getValue and prints the returned string.
Final Answer:
Hello from delegate -> Option A
Quick Check:
Delegate getValue returns string [OK]
Hint: getValue defines returned property value [OK]
Common Mistakes:
Expecting default property value instead of delegate's
Confusing getValue with setValue
Assuming compilation error due to missing parameters
4. Identify the error in this Kotlin code using a custom delegated property:
class Delegate {
operator fun getValue(thisRef: Any?, property: kotlin.reflect.KProperty<*>): Int {
return 42
}
}
class Example {
var number: Int by Delegate()
}
fun main() {
val e = Example()
e.number = 10
println(e.number)
}
medium
A. Delegate class must be an interface
B. Property number should be val, not var
C. getValue must return String, not Int
D. Delegate class lacks setValue operator function
Solution
Step 1: Check property mutability and delegation
The property number is var, so delegate must support both get and set.
Step 2: Verify delegate methods
The Delegate class only defines getValue, missing setValue needed for var.
Final Answer:
Delegate class lacks setValue operator function -> Option D
Quick Check:
var needs getValue and setValue [OK]
Hint: var properties need both getValue and setValue [OK]
Common Mistakes:
Forgetting setValue for var properties
Assuming getValue return type must be String
Thinking delegate must be interface
5. You want to create a custom delegated property that logs every time the property is read or written. Which of the following delegate implementations correctly achieves this?
class LoggingDelegate<T>(var value: T) {
operator fun getValue(thisRef: Any?, property: kotlin.reflect.KProperty<*>): T {
println("Getting value of ${property.name}")
return value
}
operator fun setValue(thisRef: Any?, property: kotlin.reflect.KProperty<*>, newValue: T) {
println("Setting value of ${property.name} to $newValue")
value = newValue
}
}
class Example {
var data: String by LoggingDelegate("initial")
}
fun main() {
val e = Example()
e.data = "new"
println(e.data)
}
hard
A. Logs on get and set, prints 'Setting value of data to new' then 'Getting value of data' and 'new'
B. Only logs on get, no output on set
C. Throws error because delegate class is not generic
D. Does not compile due to missing constructor parameters
Solution
Step 1: Analyze delegate methods
The delegate defines getValue and setValue with print statements logging property access.
Step 2: Trace main function output
Setting e.data = "new" prints setting log, then printing e.data triggers get log and prints value.
Final Answer:
Logs on get and set, prints 'Setting value of data to new' then 'Getting value of data' and 'new' -> Option A
Quick Check:
Delegate logs on get/set correctly [OK]
Hint: Check both getValue and setValue print logs [OK]
Common Mistakes:
Missing setValue causes no set logging
Assuming delegate must be non-generic
Forgetting to pass initial value to delegate
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.