Reputation: 5307
Just have started with Kotlin, where you can have a primary constructor and secondary ones. The question may sound simple, but I couldn't find an answer to it (I've read the "constructors" section in the documentation ) - why?
Basically, I'm trying to understand what is the idea behind being primary and secondary. And what is the difference in how they are used (seems like there's not, so why the separation)?
Upvotes: 5
Views: 1994
Reputation: 365
// How to declare a primary constructor
class Student constructor(
firstName: String,
lastName: String
) {
}
// We can omit constructor keyword if the primary constructor
// does not have any annotations or visibility modifiers
class Student(
firstName: String,
lastName: String
) {
}
fun main() {
val student1 = Student("Helen", "trump")
}
class Student(
firstName: String,
lastName: String
) {
init {
println("Welcome to the student profile")
}
}
class Pizza constructor (
var crustSize: String,
var crustType: String,
val toppings: MutableList<String> = mutableListOf()
) {
// secondary constructor (no-args)
constructor() : this("SMALL", "THIN")
// secondary constructor (2-args)
constructor(crustSize: String, crustType: String) : this(crustSize, crustType, mutableListOf<String>())
override fun toString(): String = "size: ${crustSize}, type: ${crustType}, toppings: ${toppings}"
}
fun main(args: Array<String>) {
val p1 = Pizza()
val p2 = Pizza("LARGE", "THICK")
val p3 = Pizza("MEDIUM", "REGULAR", mutableListOf("CHEESE", "PEPPERONI"))
println(p1)
println(p2)
println(p3)
}
Output:
size: SMALL, type: THIN, toppings: []
size: LARGE, type: THICK, toppings: []
size: MEDIUM, type: REGULAR, toppings: [CHEESE, PEPPERONI]
Upvotes: 4
Reputation: 272467
The are various syntactic differences, clearly. But a major conceptual difference is that all secondary constructors ultimately delegate to the primary constructor.
The way I think about this is that the primary constructor is the canonical interface for creating an object, and secondary constructors are like static helpers for transforming other argument sets to comply with this interface.*
* Please note this is a personal interpretation, not backed up with official docs in any way!
Upvotes: 8
Reputation: 30676
the kotlin primary constructor help you to write the compact code :
you can write class without body, e.g:data class
, for example:
data class Data(val value:String)
if you don't have any annotation on constructor, then the keyword constructor
can be ommitted. a negative example:
class Foo @Annotation constructor()
it make the inherit simply, for example:
open class Bar(val value: String);
class Primary(value: String, other: String) : Bar(value)
class Secondary : Bar {
constructor(value: String, other: String) : super(value)
}
it can using delegations by keyword by
, but secondary constructor can't uses.
interface Rule {
fun apply(value: String): Int
}
open class Policy(rule: Rule) : Rule by rule;
Upvotes: 0