Я пытаюсь написать фабричный класс в Котлине. В Java:Kotlin - класс фабрики со свойствами вопросов
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?
В I помните, что геттеры автоматически реализованы только в классах данных. Может кто-нибудь прояснить эту ситуацию или, может быть, сказать мне правильный способ, как это реализовать? ОБНОВЛЕНИЕ:
Я использую этот класс в Котлине, ссылаясь на сами свойства, например. MyFactory.instance !!. FirstInstance, но это неправильно делать так.
Спасибо за ваш ответ, так что MyFactory.instance в основном действительный метод get-accessor? –
@ Илья Пузанов, пожалуйста. Да, компилятор Kotlin будет генерировать 'MyFactory.getInstance()' для Java, а в Kotlin 'MyFactory.instance' уже * получает * значение свойства. – hotkey