J'ai une classe existante nommée Legacy qui est la plupart du temps écrite en style singleton old school. Maintenant, je veux introduire un nouveau champ et j'aimerais utiliser Guice. Legacy elle-même n'est pas contrôlée par Guice, elle est utilisée par une autre classe Service (à l'intérieur de la classe Service, elle appelle la classe getInstance() de Legacy pour récupérer l'objet Legacy) et cette classe Service a été créée à l'aide de Guice injector.Comment utiliser l'injection de guice pour une classe singleton existante?
public class Legacy {
public synchronized static Legacy getInstance() {
if(sInstance == null) {
sInstance = new Legacy();
}
return sInstance;
}
private Legacy() {
legacyObj = LegacyField.getInstance(); // get a singleton
}
private static Legacy sInstance;
private LegacyField legacyObj;
private NewField newObj; // this is the new dependency I would like to add using Guice
}
Ce que j'ai essayé est que j'ai essayé de mettre la méthode Injecter dans la classe Legacy
@Inject
public void setNewField(NewField newObj) {
this.newObj = newObj;
}
Et dans le fichier module du service, je lie l'objet NewField, mais quand je lance le programme, il a jeté une exception NullPointer. Donc, l'injection ne fonctionne pas. Toute idée de comment faire de NewField injecter dans mon programme, mais garder le paradigme de la vieille école singleton et ne pas trop changer à propos de tout le reste?
EDIT Il existe au moins trois solutions ci-dessous et je ne sais pas quel est le meilleur ou sont-ils équivalents.
Les 3 solutions sont plus ou moins équivalentes. Ils appellent tous (directement ou indirectement) 'injectMembers' sur votre singleton. –