2016-04-30 12 views
1

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?

Antwort

0

Ich glaube nicht, Roboguice ist das Problem, das ist Standardverhalten. Sie rufen getAllIntegersBSAsObservable, eine Instanzmethode, die this.behaviorSubject.asObservable(); ein Instanzfeld zurückgibt. Obwohl alle Instanzen Singletons sind, sind sie immer noch separate Instanzen, so dass sie jeweils ihre eigene Instanz von behaviorSubject haben.


Eine mögliche Lösung ist behaviorSubject ein static Feld zu machen.

+0

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 –