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?