Kotlin – Фабричный класс со свойствами

Я пытаюсь написать фабричный класс в Котлине. В Java:

public class MyFactory { private static MyFactory instance = null; private Properties props = null; private FirstClass firstInstance = null; private SecondClass secondInstance = null; private MyFactory() { props = new Properties(); try { props.load(new FileInputStream("path/to/config")); String firstClass = props.getProperty(“first.class”); String secondClass = props.getProperty(“second.class”); firstInstance = (FirstClass) Class.forName(firstClass).newInstance(); secondInstance = (SecondClass) Class.forName(secondClass).newInstance(); } catch (Exception ex) { ex.printStackTrace(); } } static { instance = new MyFactory(); } public static MyFactory getInstance() { return instance; } public FirstClass getFirstClass() { return firstInstance; } public SecondClass getSecondClass() { return secondInstance; } } 

И я столкнулся с несколькими проблемами, пытающимися переписать это в Котлине. Я попытался сгенерировать код сначала с помощью конвертера Java на try.kotlinlang.org. Результат:

 class MyFactory private constructor() { private var props: Properties? = null private var firstInstance: FirstClass? = null private var secondInstance: SecondClass? = null init { try { props!!.load(FileInputStream("path/to/conf")) val firstClass = props!!.getProperty("prop") val secondClass = props!!.getProperty("prop") firstInstance = Class.forName(firstClass).newInstance() as FirstClass secondInstance = Class.forName(secondClass).newInstance() as SecondClass } catch (ex: Exception) { ex.printStackTrace() } } companion object { var instance: MyFactory? = null init{ instance = MyFactory() } } } 

Я использую IntelliJ IDEA 15, и он говорит, что у этого класса нет метода getInstance() , но когда я пытаюсь его реализовать, он говорит:

  Platform declaration clash: The following declarations have the same JVM signature: fun <get-instance>(): my.package.MyFactory? fun getInstance(): my.package.MyFactory? 

Насколько я помню, геттеры автоматически реализованы только в классах данных. Может кто-нибудь прояснить эту ситуацию или, может быть, сказать мне правильный способ, как это реализовать? ОБНОВИТЬ:
Я использую этот класс в Котлине, ссылаясь на сами свойства, например. MyFactory.instance !!. FirstInstance, но это неправильно делать так.

Solutions Collecting From Web of "Kotlin – Фабричный класс со свойствами"

Объяснение следующее:

Компилятор Kotlin создает геттеры и сеттеры для всех свойств, но они видны только на Java. В Kotlin свойства являются идиоматическими, и они даже генерируются из пары getter и setter Java при использовании классов Java.

Таким образом, объявление метода getInstance действительно сталкивается с автогенерированным getter, который будет отображаться в Java-коде .

Если вам требуется пользовательское поведение, используйте синтаксис getter:

 var instance: MyFactory? = null get() { /* do something */ return field } 

В этом примере field является мягким ключевым словом и означает поле поддержки для свойства.

Это описано здесь .

Кстати, объявление объекта, похоже, хорошо подходит вашему делу.