I play with Kotlin and found interesting behavior. So let's say I want to have some kind of Factory:
internal interface SomeStupidInterface {
companion object FACTORY {
fun createNew(): ChangeListener {
val time = System.currentTimeMillis()
return ChangeListener { element -> Log.e("J2KO", "time " + time) }
}
fun createTheSame(): ChangeListener {
return ChangeListener { element -> Log.e("J2KO", "time " + System.currentTimeMillis()) }
}
}
fun notifyChanged()
}
where is ChangeListenerdefined in the java file:
interface ChangeListener {
void notifyChange(Object element);
}
And then I try to use it with Java like this:
ChangeListener a = SomeStupidInterface.FACTORY.createNew();
ChangeListener b = SomeStupidInterface.FACTORY.createNew();
ChangeListener c = SomeStupidInterface.FACTORY.createTheSame();
ChangeListener d = SomeStupidInterface.FACTORY.createTheSame();
Log.e("J2KO", "createNew a == b -> " + (a == b));
Log.e("J2KO", "createTheSame c == d -> " + (c == d));
Results:
createNew: a == b -> false
createTheSame: c == d -> true
I can understand why createNewreturns new objects due to closure. But why am I getting the same instance from a method createTheSame?
PS I know that the code above is not idiomatic :)
j2ko source
share