Bird
Raised Fist0
Kotlinprogramming~10 mins

Custom getters and setters in Kotlin - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Custom getters and setters
Property declared
↓
Getter called?
No→Return stored value
Yes↓
Execute custom getter code
↓
Setter called?
No→No change
Yes↓
Execute custom setter code
↓
Update stored value if setter allows
↓
End
When you access a property, Kotlin runs the getter code. When you assign a value, Kotlin runs the setter code. Custom code can control how values are read or changed.
Execution Sample
Kotlin
var age: Int = 0
    get() = field
    set(value) {
        if (value >= 0) field = value
    }
Defines an age property with a custom setter that only accepts non-negative values.
Execution Table
StepActionInput/ValueGetter Called?Setter Called?Stored Value (field)Output/Result
1Initialize age0NoNo00
2Set age to 1010NoYes1010
3Get ageN/AYesNo1010
4Set age to -5-5NoYes10Setter ignores negative, value unchanged
5Get ageN/AYesNo1010
6Set age to 2020NoYes2020
7Get ageN/AYesNo2020
💡 Execution ends after last get; setter ignores invalid negative value, so stored value stays valid.
Variable Tracker
VariableStartAfter 1After 2After 3After 4After 5After 6Final
age (field)00101010102020
Key Moments - 2 Insights
Why does the stored value not change when setting age to -5?
Because the custom setter checks if the value is negative and ignores it if so, as shown in step 4 of the execution_table where setter is called but stored value remains 10.
When is the getter code executed?
The getter runs whenever the property is read, like in steps 3, 5, and 7 where 'Getter Called?' is Yes and the stored value is returned.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the stored value of age after step 4?
A0
B10
C-5
D20
💡 Hint
Check the 'Stored Value (field)' column at step 4 where setter ignores negative value.
At which step does the getter first return the value 10?
AStep 3
BStep 2
CStep 4
DStep 5
💡 Hint
Look at 'Getter Called?' and 'Output/Result' columns in execution_table.
If the setter did not check for negative values, what would be the stored value after step 4?
A0
B10
C-5
D20
💡 Hint
Consider what happens if setter always assigns the input value without condition.
Concept Snapshot
Custom getters and setters in Kotlin let you run code when reading or writing a property.
Use 'get()' to customize reading, 'set(value)' to customize writing.
Inside setter, use 'field' to access the actual stored value.
You can add checks or transformations before changing the value.
This helps keep data valid and control property behavior.
Full Transcript
This example shows a Kotlin property 'age' with custom getter and setter. The getter simply returns the stored value. The setter only updates the stored value if the new value is zero or positive. The execution table traces initializing age to 0, setting it to 10, reading it, trying to set it to -5 (which is ignored), reading again, setting to 20, and reading again. The variable tracker shows how the stored value changes only when valid values are set. Key moments clarify why negative values are ignored and when the getter runs. The quiz tests understanding of these steps. This helps beginners see how custom getters and setters control property access and assignment in Kotlin.

Practice

(1/5)
1. What is the main purpose of custom getters and setters in Kotlin?
easy
A. To create new classes automatically
B. To define functions outside a class
C. To control how properties are read and written
D. To import external libraries

Solution

  1. Step 1: Understand property access

    Custom getters and setters allow you to define how a property value is retrieved or changed.
  2. Step 2: Identify their purpose

    They help control and protect the data by customizing read/write behavior.
  3. Final Answer:

    To control how properties are read and written -> Option C
  4. Quick Check:

    Custom getters/setters = control property access [OK]
Hint: Remember: getters/setters control property reading/writing [OK]
Common Mistakes:
  • Confusing getters/setters with class creation
  • Thinking they define functions outside classes
  • Assuming they import libraries
2. Which of the following is the correct syntax to define a custom setter for a Kotlin property age?
easy
A. var age: Int set(value) { field = value }
B. var age: Int get(value) { field = value }
C. val age: Int set(value) { field = value }
D. var age: Int set { value = field }

Solution

  1. Step 1: Check property mutability

    Setter can only be defined for var, not val.
  2. Step 2: Verify setter syntax

    The setter uses set(value) { field = value } to assign the new value.
  3. Final Answer:

    var age: Int set(value) { field = value } -> Option A
  4. Quick Check:

    Setter syntax = set(value) { field = value } [OK]
Hint: Setter needs var and set(value) syntax [OK]
Common Mistakes:
  • Using get instead of set for setter
  • Defining setter on val property
  • Reversing field and value in setter
3. What will be the output of this Kotlin code?
class Person {
    var name: String = ""
        get() = field.uppercase()
        set(value) { field = value.trim() }
}

fun main() {
    val p = Person()
    p.name = "  alice  "
    println(p.name)
}
medium
A. ALICE
B. alice
C. ecila
D. Alice

Solution

  1. Step 1: Analyze setter behavior

    Setter trims the input, so " alice " becomes "alice" stored in field.
  2. Step 2: Analyze getter behavior

    Getter returns the stored value in uppercase, so "alice" becomes "ALICE".
  3. Final Answer:

    ALICE -> Option A
  4. Quick Check:

    Setter trims, getter uppercases = ALICE [OK]
Hint: Setter trims, getter uppercases output [OK]
Common Mistakes:
  • Ignoring trimming in setter
  • Not converting to uppercase in getter
  • Assuming original input prints
4. Identify the error in this Kotlin class with custom getter and setter:
class Box {
    var size: Int = 0
        get() = field
        set(value) {
            if (value > 0) field = value
            else field = 0
        }

    fun printSize() {
        println(size)
    }
}
medium
A. Setter does not assign value correctly
B. No error, code works fine
C. Getter should not use field
D. Property size should be val, not var

Solution

  1. Step 1: Check setter logic

    Setter assigns field = value if positive, else 0. This is valid.
  2. Step 2: Check getter and property type

    Getter returns field, which is correct. Property is var, so setter allowed.
  3. Final Answer:

    No error, code works fine -> Option B
  4. Quick Check:

    Setter and getter correct = no error [OK]
Hint: Setter with condition is valid; getter uses field correctly [OK]
Common Mistakes:
  • Thinking getter can't use field
  • Assuming setter must always assign value
  • Confusing var and val for setters
5. You want a Kotlin property score that never stores a negative value. Which custom setter implementation ensures this correctly?
hard
A. var score: Int = 0 set(value) { field = value * -1 }
B. var score: Int = 0 set(value) { if (value < 0) field = 0 }
C. var score: Int = 0 set(value) { field = value }
D. var score: Int = 0 set(value) { field = if (value < 0) 0 else value }

Solution

  1. Step 1: Understand requirement

    Property must never store negative values; negative inputs become zero.
  2. Step 2: Evaluate each setter

    var score: Int = 0 set(value) { field = if (value < 0) 0 else value } sets field to 0 if value is negative, else stores value correctly.
  3. 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.
  4. Final Answer:

    var score: Int = 0 set(value) { field = if (value < 0) 0 else value } -> Option D
  5. Quick Check:

    Setter with if-else ensures no negatives [OK]
Hint: Use if-else in setter to block negatives [OK]
Common Mistakes:
  • Not assigning field for positive values
  • Allowing negative values to be stored
  • Incorrectly negating values
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard