Je joue avec Kotlin et j'ai trouvé un comportement intéressant. Donc, disons que je veux avoir une sorte d'usine :
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()
}
où ChangeListener
défini dans le fichier Java :
interface ChangeListener {
void notifyChange(Object element);
}
Ensuite, j'essaie de l'utiliser à partir de Java, comme suit :
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));
Les résultats sont les suivants :
createNew: a == b -> false
createTheSame: c == d -> true
Je comprends pourquoi createNew
renvoie de nouveaux objets en raison de la fermeture. Mais pourquoi je reçois la même instance de createTheSame
méthode ?
P.S. Je sais que le code ci-dessus n'est pas idiomatique :)