Ho riscontrato un errore insolito mentre lavoravo al mio progetto. Per imparare meglio e ricordarlo, vorrei sapere se questo tipo di errore ha un nome o una definizione. (L'errore stesso OutOfMemoryError
non è insolito, sto parlando di ciò che ha portato a questo errore).
La mia situazione (semplificata) era questa:
Ho avuto una classe Singleton
:
class Singleton extends ClassA{
private static Singleton instance;
private Singleton(){ // implicitly calls super() }
public static Singleton getInstance(){
if (instance==null) instance = new Singleton();
return instance;
}
}
Ed è superclasse ClassA
:
abstract class ClassA{
public ClassA(){
ClassB objectB = new ClassB();
// .. some logic ..
}
}
E una classe ClassB
che utilizza Singleton
nel suo costruttore:
class ClassB{
public ClassB(){
Singleton singleton = Singleton.getInstance();
// .. some logic ..
}
}
Quello che succede è il seguente:
1- ClassB
è istanziato da qualche parte. Il costruttore viene richiamato e chiama Singleton.getInstance()
.
2- Singleton.getInstance()
vede che instance == null
ed esegue instance = new Singleton()
.
3- Viene eseguito il costruttore di Singleton
. È vuoto, ma chiama implicitamente il costruttore della superclasse ( ClassA
).
4- La superclasse di Singleton
istanzia un ClassB
oggetto new ClassB()
.
Viene richiamato il costruttore di 5 ClassB
e chiama Singleton.getInstance()
...
Poiché l'istanziazione di instance
in Singleton
non ha mai raggiunto la fine, instance == null
restituisce ancora true
e il ciclo non termina mai.
Risultante in un ciclo infinito, che alla fine ha generato un OutOfMemoryError
.
Quindi la mia domanda è: questo tipo di errore di loop infinito con singleton è un problema comune? Qualche idea su come posso evitarlo in futuro?