Intereting Posts
Могу ли я получить KFunction из переменной типа функции в Kotlin? как запустить скомпилированный файл класса в Котлине? Привязка данных Android к CustomView, неспособная установить viewmodel из Activity в компонент Использование исключительного метода CompletedFuture в Котлине Вложенные многозадачи в Котлине Как вводить в переданное имущество Котлин с помощью кинжала 2? GL_INVALID_OPERATION на glBufferData () в kotlin Конструктор класса данных с двумя разными конструкторами в Котлине проверка отражения kotlin с нулевыми типами Заголовки HTTP не возвращаются на EC2 Создайте пользовательский кинжал 2 с помощью Kotlin Почему результат функции не работает как предложение в заявлении when в Kotlin? Как заставить Джексона использовать параметры по умолчанию для Kotlin для отсутствующих значений? API вызова Coroutine Как представлять несколько типов (типы объединения) при настройке JavaScript

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

В 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 конструктора приводит к тому, что он не доступен извне класса, даже не из того же файла.

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

 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