📖 Scenario: You are creating a simple Kotlin class to represent a bank account. You want to control how the balance is accessed and changed by using custom getters and setters.
🎯 Goal: Build a Kotlin class BankAccount with a balance property. Use custom getter to show the balance with a message, and a custom setter to prevent setting a negative balance.
📋 What You'll Learn
Create a class called BankAccount with a balance property of type Double initialized to 0.0
Add a custom getter for balance that returns the balance as a string with the message: "Current balance: $X" where X is the balance
Add a custom setter for balance that only updates the balance if the new value is not negative
Create an instance of BankAccount, set the balance to 100.0, then try to set it to -50.0, and finally print the balance
💡 Why This Matters
🌍 Real World
Bank accounts and financial apps often need to control how money values are accessed and changed to avoid errors or fraud.
💼 Career
Understanding custom getters and setters is important for writing safe and clear Kotlin code in real-world applications.
Progress0 / 4 steps
1
Create the BankAccount class with a private balance
Create a Kotlin class called BankAccount with a balance property of type Double initialized to 0.0.
Kotlin
Hint
Use var balance: Double = 0.0 inside the class.
2
Add a custom getter for balance
Add a custom getter for the balance property that returns a String with the message: "Current balance: $X" where X is the current balance value.
Kotlin
Hint
Create a new val displayBalance with a custom getter that returns the message string.
3
Add a custom setter to prevent negative balance
Add a custom setter for the balance property that only updates the balance if the new value is not negative. If the new value is negative, do not change the balance.
Kotlin
Hint
Use set(value) { if (value >= 0) field = value } to protect the balance.
4
Create an instance, set balances, and print
Create an instance of BankAccount called account. Set the balance to 100.0, then try to set it to -50.0. Finally, print account.displayBalance.
Kotlin
Hint
Remember to create account, set balance twice, and print account.displayBalance.
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
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 C
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
Step 1: Check property mutability
Setter can only be defined for var, not val.
Step 2: Verify setter syntax
The setter uses set(value) { field = value } to assign the new value.
Final Answer:
var age: Int
set(value) { field = value } -> Option A
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
Step 1: Analyze setter behavior
Setter trims the input, so " alice " becomes "alice" stored in field.
Step 2: Analyze getter behavior
Getter returns the stored value in uppercase, so "alice" becomes "ALICE".
Final Answer:
ALICE -> Option A
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
Step 1: Check setter logic
Setter assigns field = value if positive, else 0. This is valid.
Step 2: Check getter and property type
Getter returns field, which is correct. Property is var, so setter allowed.
Final Answer:
No error, code works fine -> Option B
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
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 } sets field to 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 D
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 unknownstrongwhile earning +1 Grip toward your certificate.