Custom getters and setters in Kotlin - Time & Space Complexity
When using custom getters and setters in Kotlin, it's important to know how often these methods run as your program works.
We want to find out how the time to run changes when we access or change properties with custom code.
Analyze the time complexity of the following code snippet.
class Rectangle(var width: Int, var height: Int) {
var area: Int = 0
get() = width * height
set(value) {
field = value
width = value / height
}
}
fun main() {
val rect = Rectangle(10, 5)
println(rect.area)
rect.area = 50
println(rect.width)
}
This code defines a rectangle with custom getter and setter for the area property.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The getter multiplies width and height each time area is accessed.
- How many times: Once per access; no loops or recursion involved.
Each time you get or set the area, the operations run once, no matter the size of width or height.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 1 multiplication or division |
| 100 | 1 multiplication or division |
| 1000 | 1 multiplication or division |
Pattern observation: The number of operations stays the same regardless of input size.
Time Complexity: O(1)
This means accessing or setting the property takes the same short time no matter the values involved.
[X] Wrong: "Custom getters and setters slow down the program a lot as values get bigger."
[OK] Correct: The operations inside getters and setters run once per access, so their time does not grow with the size of the values.
Understanding how custom getters and setters work helps you explain property access performance clearly and confidently in real projects.
"What if the getter computed the area by looping over a list of rectangles? How would the time complexity change?"
Practice
Solution
Step 1: Understand property access
Custom getters and setters allow you to define how a property value is retrieved or changed.Step 2: Identify their purpose
They help control and protect the data by customizing read/write behavior.Final Answer:
To control how properties are read and written -> Option CQuick Check:
Custom getters/setters = control property access [OK]
- Confusing getters/setters with class creation
- Thinking they define functions outside classes
- Assuming they import libraries
age?Solution
Step 1: Check property mutability
Setter can only be defined forvar, notval.Step 2: Verify setter syntax
The setter usesset(value) { field = value }to assign the new value.Final Answer:
var age: Int set(value) { field = value } -> Option AQuick Check:
Setter syntax = set(value) { field = value } [OK]
- Using get instead of set for setter
- Defining setter on val property
- Reversing field and value in setter
class Person {
var name: String = ""
get() = field.uppercase()
set(value) { field = value.trim() }
}
fun main() {
val p = Person()
p.name = " alice "
println(p.name)
}Solution
Step 1: Analyze setter behavior
Setter trims the input, so " alice " becomes "alice" stored infield.Step 2: Analyze getter behavior
Getter returns the stored value in uppercase, so "alice" becomes "ALICE".Final Answer:
ALICE -> Option AQuick Check:
Setter trims, getter uppercases = ALICE [OK]
- Ignoring trimming in setter
- Not converting to uppercase in getter
- Assuming original input prints
class Box {
var size: Int = 0
get() = field
set(value) {
if (value > 0) field = value
else field = 0
}
fun printSize() {
println(size)
}
}Solution
Step 1: Check setter logic
Setter assignsfield = valueif positive, else 0. This is valid.Step 2: Check getter and property type
Getter returnsfield, which is correct. Property is var, so setter allowed.Final Answer:
No error, code works fine -> Option BQuick Check:
Setter and getter correct = no error [OK]
- Thinking getter can't use field
- Assuming setter must always assign value
- Confusing var and val for setters
score that never stores a negative value. Which custom setter implementation ensures this correctly?Solution
Step 1: Understand requirement
Property must never store negative values; negative inputs become zero.Step 2: Evaluate each setter
var score: Int = 0 set(value) { field = if (value < 0) 0 else value } setsfieldto 0 if value is negative, else stores value correctly.Step 3: Check other options
A stores negative of value, which can be positive or negative incorrectly; B only sets field if negative, ignoring positive values; C stores negatives unchanged.Final Answer:
var score: Int = 0 set(value) { field = if (value < 0) 0 else value } -> Option DQuick Check:
Setter with if-else ensures no negatives [OK]
- Not assigning field for positive values
- Allowing negative values to be stored
- Incorrectly negating values
Ready to prove it?
Pass the test and this pattern moves unknown
