Skip to main content

Constructors in Kotlin

· 4 min read

Constructors are regular functions that give a chance to developer to initialise state of class instance. They are completely optional, and it's perfectly valid to have this, although not so useful 😃

class Person

Constructors in Kotlin behave very similar to the ones we have in Java. We have two types of constructors in Kotlin:

  • Primary
  • Secondary

Primary constructors

Primary constructors give us a chance to initialise state of our instance with very clean syntax. An example of the class having primary constructor would be:

class PersonWithPrimaryConstructorOnly(val name: String, val age: Int) {
override fun toString() = "{name : '$name', age: $age}"
}

Primary constructor sits right next to the class name itself. Having val or var next to primary constructor parameters basically transforms passed arguments to class properties. Similar, but more verbose, and less preferred way to accomplish the same, would look like:

class PersonWithPrimaryConstructorVerbose1(name: String, age: Int) {
var name: String = name
var age: Int = age
override fun toString() = "{name : '$name', age: $age}"
}

or:

class PersonWithPrimaryConstructorVerbose2(name: String, age: Int) {
var name: String
var age: Int

init {
this.name = name
this.age = age
}

override fun toString() = "{name : '$name', age: $age}"
}

In this case, primary constructor doesn't define it's parameters as val or var, but rather we do the mapping of passed argument to properties explicitly. We should definitely prefer the first option where the compiler generates this mappings for us.

Constructor visibility

Visibility in Kotlin is public by default, which applies to the constructors as well. In case we want to change it to, let's say, private we can do it like this:

class PersonWithPrimaryConstructorOnly private constructor(val name: String, val age: Int) {
override fun toString() = "{name : '$name', age: $age}"
}

Secondary constructors

Secondary constructors are any constructors defined that are not defined as primary constructors. An example would be:

class PersonWithOnlySecondaryConstructor {
private var name: String
private var age: Int

constructor(name: String) {
this.name = name
this.age = 0
}

constructor(name: String, age: Int) : this(name) {
this.age = age
}

override fun toString() = "{name: '$name', age: $age}"
}

We've got two constructors here. The first one, with only one, name parameter, just sets the name and initiates age to 0. The second one, with additional age argument calls the first one with:

: this(name)

and additionally sets age property explicitly.

That was all for today! Hope you liked it!