Частный конструктор в Котлине

В Java можно скрыть главный конструктор класса, сделав его private а затем получив доступ к нему через public static метод внутри этого класса:

 public final class Foo { /* Public static method */ public static final Foo constructorA() { // do stuff return new Foo(someData); } private final Data someData; /* Main constructor */ private Foo(final Data someData) { Objects.requireNonNull(someData); this.someData = someData; } // ... } 

Как можно достичь такого же результата с Котлином, не отделяя класс от public интерфейса и private реализации? Создание private конструктора приводит к тому, что он не доступен извне класса, даже не из того же файла.

Solutions Collecting From Web of "Частный конструктор в Котлине"

Это возможно с помощью сопутствующего объекта:

 class Foo private constructor(val someData: Data) { companion object { fun constructorA(): Foo { // do stuff return Foo(someData) } } // ... } 

Методы внутри объекта-компаньона могут быть достигнуты так же, как если бы они были членами окружающего класса (например, Foo.constructorA() )

Вы даже можете сделать что-то более похожее на «эмуляцию» использования публичного конструктора при наличии частного конструктора.

 class Foo private constructor(val someData: Data) { companion object { operator fun invoke(): Foo { // do stuff return Foo(someData) } } } //usage Foo() //even though it looks like constructor, it is a function call