Ho avuto un problema simile con il mio codice con stato globale via singelton.
Poiché il commento di @ Thomas-Junk-s e @ SHODAN mi ha suggerito di refactored il mio codice per rendere statico lo stato globale non statico attraverso la dependency injection del costruttore.
Esempio
codice originale
public static class Global {
public static int getSomeGlobalState() {...}
}
public class MyClass {
public MyClass(...) {...}
public myFunction(....) {
....
int i = Global.getSomeGlobalState()
....
}
}
refactored metodo globale statico al metodo globale non statico
public class Global {
private Global global = new Global();
// singelton to keep old code compatible
public static Global getGlobal() {return global;}
// not static anymore
public int getSomeGlobalState() {...}
}
public class MyClass {
public MyClass(...) {...}
public myFunction(....) {
....
// replacing call to static member Global.getSomeGlobalState()
int i = Global.getGlobal().getSomeGlobalState()
....
}
}
refactoring rimosso depency alla classe statica Global
dal metodo myFunction
al costruttore
public class MyClass {
Global global;
// depricated constructor compatible with old api.
public MyClass(...) {this(..., ...;Global.getGlobal());}
// new constructor to be used in future
public MyClass(..., Global global) {...;this.global=global;}
public myFunction(....) {
....
int i = global.getSomeGlobalState()
....
}
}
dopo aver introdotto un di-contenitore: refactored per sostituire la classe statica singelton Gloal
nel contenitore
public class Global {
public Global() {...}
public int getSomeGlobalState() {...}
}
public class MyClass {
public MyClass(..., Global global) {...;this.global=global;}
public myFunction(....) {
....
int i = global.getSomeGlobalState()
....
}
}
Ogni refactoring fatto shure che il codice, che ueses MyClass
non ha bisogno di modifiche.
Nell'ultimo refactoring ho aggiunto un di-contenitore che è responsabile della creazione di un singelton Global
-Class e che inietta l'istanza globale nei suoi clienti come MyClass
in questo modo il vecchio costruttore di MyClass potrebbe essere rimosso.
[aggiornamento 2014-12-11]
se non desideri to add a dependency all over the codebase
come suggerito dal tuo commento, puoi inviare l'ultimo passo di refactoring:
public class MyClass {
// constructor used in consuming classes.
public MyClass(...) {this(..., ...;Global.getGlobal());}
// constructor used for unittests where you can replace global.
public MyClass(..., Global global) {...;this.global=global;}
}