В Kotlin возможно ли иметь фабричную функцию, которая создает экземпляр класса с частным конструктором?
Моя цель – обеспечить использование фабричной функции, которая будет использоваться, и предотвратить создание экземпляра через конструктор класса.
Пример:
// factory function, valid val myInstance = myClassOf() // class instantiation, invalid val myInstance = MyClass()
Я пытаюсь имитировать поведение некоторых встроенных функций фабрики, таких как intArrayOf()
, например
// works val myIntArray = intArrayOf() // not possible as IntArray has a private constructor val myIntArray = IntArray()
Вы можете сделать что-то вроде этого:
import MyClass.Companion.myClassOf class MyClass private constructor() { companion object { fun myClassOf() = MyClass() } } //val myInstance1 = MyClass() // not allowed val myInstance2 = myClassOf()
Вы можете использовать объект-компаньон таким образом:
class MyClass private constructor() { companion object { operator fun invoke() = MyClass() } } val myInstance = MyClass() // Calls the factory function invoke()
Назовите фабричную функцию, если она имеет особое значение. Например:
class MyClass private constructor(values: List<String>) { companion object { fun of(vararg values: String) = MyClass(values.toList()) } } val myInstance = MyClass.of("first", "second")