我正在努力在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,但这样做感觉不对。
答案 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似乎很适合你的情况。