Zunächst einmal würde ich nicht dazu raten, beliebige Methoden mit @Inject zu annotieren. Beschränken Sie es auf Konstruktoren und gelegentlich auf optionale Injektion und/oder Feldinjektion.
Was Sie vorhaben, klingt ein wenig seltsam, und ich bin mir nicht sicher, ob es genau das ist, was Sie wollen. Können Sie bitte mehr Hintergrundinformationen zu dem geben, was Sie zu tun versuchen, denn vielleicht ist ein anderer Ansatz besser. Es gibt definitiv einige Bedenken hier mit Thread-Sicherheit und wie Sie Referenzen verwalten.
Ausgehend von dem, was Sie beschrieben haben, würde ein Ansatz, wie ihn @meverett erwähnt hat, wahrscheinlich funktionieren. Wenn die Objekte, die Sie haben, sind Foo
s, würde es etwa so aussehen.
// Later on be sure to bind(Foo.class).toProvider(FooProvider.class);
final class FooProvider implements Provider<Foo> {
private final Provider<Foo> unboundFooProvider;
private Foo currentInstance;
@Inject FooProvider(@Unbound Provider<Foo> unboundFooProvider) {
this.unboundFooProvider = unboundFooProvider;
}
@Override public Foo get() {
if (currentInstance != null) {
currentInstance.unbind();
}
currentInstance = unboundFooProvider.get();
currentInstance.bind();
return currentInstance;
}
}
Beachten Sie, dass Ihr @Unbound Foo
Anbieter erzeugen würde Foo
s, ohne spezielle Methoden aufzurufen. Die reguläre FooProvider
behält den Überblick über den Status und entscheidet, wann bind()
y unbind()
die Instanzen. Bitte seien Sie vorsichtig, wie Sie mehrere Instanzen verwalten und sie mit mehreren Threads verwenden.
Außerdem, nur um das klarzustellen: Ich verwende @Unbound
denn die Methoden, die Sie aufrufen wollen, heißen bind()
y unbind()
. Ich verwende "gebunden" nicht im Sinne von Guice.
Beachten Sie auch ... aus der Spitze von meinem Kopf bin ich ziemlich sicher, dass Provider als Singletons behandelt werden, so dass die Aufrechterhaltung der Zustand wie dies funktionieren wird. Wenn es nicht, könnten Sie offensichtlich nur eine Ebene der Indirektion mit einer Art von Singleton-Fabrik erstellen (aber das sollte nicht notwendig sein).