Kotlin – 与属性问题的工厂类

我试图在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; } } 

而我在Kotlin中遇到了很多难题。 我试着用try.kotlinlang.org上的Java转换器首先生成代码。 结果是:

 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? 

我记得,getters只在数据类中自动实现。 有人可以澄清这种情况,或者告诉我如何实施这个正确的方式? 更新:
我通过引用属性本身来利用Kotlin中的这个类。 MyFactory.instance !! firstInstance,但这样做感觉不对。

解释如下:

Kotlin编译器为所有属性创建getter和setter,但是它们仅在Java中可见。 在Kotlin中,属性是惯用的,当你使用Java类的时候,它们甚至是由Java getter和setter对产生的 。

因此,声明一个方法getInstance确实会与在Java代码中可见的自动生成的getter冲突。

如果您需要自定义getter行为,请使用getter语法:

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

在这个例子中, field是一个软关键字,意味着属性的后台字段。

这里记录在案。

顺便说一下, 对象声明似乎很适合你的情况。