What if you could create objects in many ways without messy code or confusion?
Why Secondary constructors in Kotlin? - Purpose & Use Cases
Imagine you are creating a class to represent a person. You want to create objects with different sets of information: sometimes just a name, other times a name and age, or even name, age, and address. Writing separate classes or many functions for each case quickly becomes confusing and messy.
Manually handling all these different ways to create a person means repeating code and risking mistakes. You might forget to initialize some properties or write duplicate logic. It becomes slow to write and hard to maintain, especially as your class grows.
Secondary constructors let you define multiple ways to create an object inside the same class. Each constructor can handle different input combinations, sharing common setup code. This keeps your code clean, organized, and easy to extend.
class Person(val name: String) {
var age: Int? = null
var address: String? = null
fun initWithAge(age: Int) {
this.age = age
}
fun initWithAddress(address: String) {
this.address = address
}
}class Person {
var name: String
var age: Int? = null
var address: String? = null
constructor(name: String) {
this.name = name
}
constructor(name: String, age: Int) : this(name) {
this.age = age
}
constructor(name: String, age: Int, address: String) : this(name, age) {
this.address = address
}
}Secondary constructors enable creating flexible and readable classes that handle multiple initialization scenarios effortlessly.
Think of a contact app where you can add a person with just a name, or with name and phone number, or with name, phone number, and email. Secondary constructors let you handle all these cases cleanly in one class.
Secondary constructors provide multiple ways to create an object in one class.
They reduce code duplication and improve clarity.
They make your classes flexible for different input data.
Practice
secondary constructor in Kotlin?Solution
Step 1: Understand constructors in Kotlin
Kotlin classes can have a primary constructor and one or more secondary constructors to create objects.Step 2: Role of secondary constructors
Secondary constructors allow creating objects with different sets of parameters, providing flexibility.Final Answer:
To provide additional ways to create an object with different parameters -> Option CQuick Check:
Secondary constructors = multiple ways to create objects [OK]
- Thinking secondary constructors replace the primary constructor
- Confusing constructors with functions
- Assuming secondary constructors create static methods
Solution
Step 1: Recall Kotlin secondary constructor syntax
Secondary constructors use the keywordconstructorfollowed by parameters and a body.Step 2: Check each option
constructor(name: String) { this.name = name } uses correct syntax:constructor(name: String) { ... }. Others use invalid keywords.Final Answer:
constructor(name: String) { this.name = name } -> Option DQuick Check:
Keyword 'constructor' starts secondary constructors [OK]
- Adding 'fun' before constructor
- Using 'secondary' keyword
- Confusing with init blocks
class Person(val name: String) {
var age: Int = 0
constructor(name: String, age: Int) : this(name) {
this.age = age
}
}
fun main() {
val p = Person("Alice", 30)
println("Name: ${p.name}, Age: ${p.age}")
}Solution
Step 1: Understand constructor calls
The secondary constructor calls the primary constructor withthis(name), initializingname.Step 2: Assign age in secondary constructor
The secondary constructor setsthis.age = age, soagebecomes 30.Final Answer:
Name: Alice, Age: 30 -> Option BQuick Check:
Secondary constructor sets age correctly [OK]
- Assuming age stays 0
- Thinking name is empty
- Expecting compilation error
class Car(val model: String) {
constructor(model: String, year: Int) {
println("Year: $year")
}
}Solution
Step 1: Check secondary constructor rules
In Kotlin, a secondary constructor must delegate to the primary constructor using: this(...).Step 2: Analyze given code
The secondary constructor does not callthis(model), so it violates the rule.Final Answer:
Secondary constructor must call the primary constructor -> Option AQuick Check:
Secondary constructors require delegation [OK]
- Forgetting to delegate to primary constructor
- Trying to assign val property directly
- Thinking println is disallowed
Book with a primary constructor that takes title and a secondary constructor that also takes author. The secondary constructor should reuse the primary constructor and set author. Which code correctly implements this?Solution
Step 1: Check primary constructor and property initialization
class Book(val title: String) { var author: String = "Unknown" constructor(title: String, author: String) : this(title) { this.author = author } } defines primary constructor withtitleand a mutableauthorproperty with default value.Step 2: Verify secondary constructor delegates properly
The secondary constructor calls: this(title)to reuse primary constructor and setsauthorinside its body.Final Answer:
class Book(val title: String) { var author: String = "Unknown" constructor(title: String, author: String) : this(title) { this.author = author } } -> Option AQuick Check:
Secondary constructor delegates and sets extra property [OK]
- Not delegating secondary constructor to primary
- Trying to assign val properties
- Missing property initialization
Ready to prove it?
Pass the test and this pattern moves unknown
