Ich habe eine Basisklasse und 2 abgeleitete Klassen. Ich werde versuchen, mit einer sehr vereinfachten Version zu erklären:Vererbung und Abhängigkeitsinjektion mit Roboguice und RxJava
public class AllIntegers{
List<Integer> myList;
BehaviorSubjec<Integer> behaviorSubject;
@Inject
public AllIntegers(List<Integers> allIntegers) {
behaviorSubject = BehaviorSubject.create();
//some logic
}
public BehaviorSubject<Integer> getAllIntegersBSAsObservable() {
return this.behaviorSubject.asObservable();
}
}
public class OddIntegers extends AllIntegers {
List<Integer> myList;
@Inject
public OddIntegers(... some dependencies...) {
/* ... some logic ... */
//Getting observable from parent
getAllIntegersBSAsObservable.subscribe(new Subscriber(...));
}
}
public class EventIntegers extends AllIntegers {
List<Integer> myList;
@Inject
public EventIntegers(... some dependencies...) {
/* ... some logic ... */
//Getting observable from parent
getAllIntegersBSAsObservable.subscribe(new Subscriber(...));
}
}
Meine Roboguice Moduldatei sieht wie folgt aus:
bind(IAllIntegers.class).to(AllIntegers.class).in(Scopes.SINGLETON);
bind(IOddIntegers.class).to(OddIntegers.class).in(Scopes.SINGLETON);
bind(IEventIntegers.class).to(EventIntegers.class).in(Scopes.SINGLETON);
Auch ich hier vereinfacht über, um es einfacher zu schreiben und zu verstehen.
Das Problem ist, dass Roboguice eine Instanz von AllIntegers.class erstellt, wie es sollte. Ich muss jedoch der AllIntegers.class einen leeren Konstruktor hinzufügen, damit sich der Compiler nicht beschweren kann. Dies führt natürlich dazu, dass OddIntegers und EventIntegers ihre eigene Instanz von AllIntegers bekommen, so dass beide untergeordneten Instanzen verschiedene Instanzen der Observable während der Singleton-Basisklasse erhalten bekommt auch seine eigene (das ist die, die ich eigentlich will), also, wenn ich onnext auf das Verhaltensthema feuern, reagieren die Kinder nicht, weil das Verhaltensthema unterschiedlich ist.
Sollte ich Komposition statt Vererbung verwenden?
Sie haben Recht, es ist kein Roboguice Problem, es ist eigentlich kein Problem mit etwas anderem als meinem Design. Die Kombination von Singletons, Abhängigkeitsinjektion und Vererbung, die ich codiert habe, führte zu diesem Problem. Ich mag Ihre Lösung, das Verhalten zu markieren, ein statisches Feld, obwohl es immer noch scheint wie eine Band-Hilfe-Lösung für das Problem, das ich eingeführt habe. Ich denke, ich muss etwas Kaffee holen und es einfach neu einteilen –