2016-04-30 108 views
1

我有一個基類和2個派生類。我會嘗試用一種非常簡化的版本說明:繼承和依賴注入Roboguice和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(...)); 
    } 
} 

我Roboguice模塊文件看起來像這樣:

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); 

同樣,我在這裏簡化,使其更容易編寫和理解。

問題是,Roboguice創建了一個AllIntegers.class的實例,因爲它應該。然而,我必須爲AllIntegers.class添加一個空的構造函數來避免抱怨,這當然會導致OddIntegers和EventInteger每次都獲得它們的AllIntegers的OWN實例,所以這兩個孩子都會得到不同的observable實例,而singleton基類也會得到它自己的(這是我真正想要的),所以當我在行爲主題上觸發onNext時,由於行爲主題不同,孩子們不會做出反應。

我應該使用組合而不是繼承嗎?

回答

0

我不認爲Roboguice是問題,這是標準的行爲。你打電話給getAllIntegersBSAsObservable,一個實例方法,它會返回一個實例字段this.behaviorSubject.asObservable();。即使所有實例都是單例,但它們仍然是單獨的實例,因此它們各自具有自己的實例behaviorSubject


一種可能的解決方法是使一個behaviorSubject字段static

+0

你是對的,這不是一個Roboguice問題,它實際上不是一個除了我的設計之外的任何問題。我編碼的單例,依賴注入和繼承的組合引入了這個問題。我喜歡你的標記行爲的解決方案,雖然對於我介紹的問題,它似乎仍然是一個樂隊幫助解決方案。我想我得喝點咖啡,然後重新考慮一下 –