Kotlin - Factory Function for Class with Private Constructor

You can use companion object in this way:

class MyClass private constructor() {
  companion object {
    operator fun invoke() = MyClass()
  }
}

val myInstance = MyClass() // Calls the factory function invoke()

Name the factory function if it has a special meaning. For example:

class MyClass private constructor(values: List<String>) {
  companion object {
    fun of(vararg values: String) = MyClass(values.toList())
  }
}

val myInstance = MyClass.of("first", "second")

You can do something like this:

import MyClass.Companion.myClassOf

class MyClass private constructor() {
    companion object {
        fun myClassOf() = MyClass()
    }
}

//val myInstance1 = MyClass() // not allowed
val myInstance2 = myClassOf()

Try Builder instead.

class FoodOrder private constructor(
  val bread: String?,
  val condiments: String?,
  val meat: String?,
  val fish: String?) {

    data class Builder(
      var bread: String? = null,
      var condiments: String? = null,
      var meat: String? = null,
      var fish: String? = null) {

        fun bread(bread: String) = apply { this.bread = bread }
        fun condiments(condiments: String) = apply { this.condiments = condiments }
        fun meat(meat: String) = apply { this.meat = meat }
        fun fish(fish: String) = apply { this.fish = fish }
        fun build() = FoodOrder(bread, condiments, meat, fish)
    }
}

Reference: https://www.baeldung.com/kotlin-builder-pattern

Tags:

Kotlin