Kotlin - 具有属性问题的工厂类

时间:2016-01-03 15:19:32

标签: kotlin

我正在努力在Kotlin写工厂课程。在Java中:

String imageurl = url + "?time=" + System.currentTimeMillis();

Picasso.with(getContext()).load(imageurl).into(imageView);

我在Kotlin尝试重写这个问题时遇到了一些问题。 我尝试在try.kotlinlang.org上首先使用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;
  }

}

我正在使用IntelliJ IDEA 15,它说这个类没有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() } } } 方法,但是当我尝试实现它时,它说:

getInstance()

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

1 个答案:

答案 0 :(得分:3)

解释如下:

Kotlin编译器为所有属性创建getter和setter,但它们仅在Java中可见。在Kotlin中,属性是惯用的,当您使用Java类时,它们甚至是generated from Java getter and setter pair

因此声明方法getInstance确实与auto-generated getter that will be visible in Java code冲突。

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

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

在此示例中,field是一个软关键字,表示该属性的支持字段。

记录在案here

顺便说一下,object declaration似乎很适合你的情况。