2013-05-30 39 views
1

我搞砸了一些模式,使代碼更加模塊化。所以,我有這樣的事情:如何使用回調權限?

class A implements ICallback { 
    MyObject o; 
    B b = new B(this, someParameter); 

    @Override 
    public void callback(MyObject o){ 
      this.o = o; 
    } 
} 

class B { 
    ICallback ic; 
    B(ICallback ic, someParameter){ 
     this.ic = ic; 
    } 

    new Thread(new Runnable(){ 
     public void run(){ 
      // some calculation 
      ic.callback(myObject) 
     } 
    }).start(); 
} 

interface ICallback(){ 
    public void callback(MyObject o); 
} 

我不得不等待在AMyObject,所以我使用的callback如果ThreadB工作完成通知A。但現在我必須把所有的邏輯處理MyObject和在callback進一步處理。

我能否以某種方式避免或以正確的方式?

+0

爲什麼你需要避免這種情況?有什麼理由嗎? – shazin

+0

不清楚你想要做什麼以及要避免什麼。原則上,您的代碼是可以接受的,但請記住,A.callback()是從B中的線程調用的,所以如果您想從其他線程訪問A的字段,例如創建A實例的線程,那麼你需要添加一些同步。 –

+0

我問過要避免這種情況,因爲我的整個程序依賴於MyObject。所以所有的工作都必須在這個回調中完成。 –

回答

2

你的方法基本上是合理的,但class A本應該不會實現ICallback。更典型且更靈活的方案是將匿名回調實現的實例傳遞到B

另請注意,回調的所有處理都將在由B開始的線程上完成。

與上述有關的觀察是回答您的疑慮約callback做的MyObject所有的處理:有根本沒有其他辦法可以做到這一點,因爲提供MyObject的動作是由B的線程,並開始控制可以只能從該方法向外流動。如果您希望處理跳轉到主線程,則需要一個更復雜的涉及阻塞隊列的方案。

+0

是的,你的意思是IoC。但是,如果MyObject在類A中實例化並準備在回調之外使用,我的想法即將檢查線程是完成還是更具體。我在問,因爲唯一讓我想到的就是投票。 –

+0

投票不是一個明智的選擇,也不會阻止事件的預測。實際上,最好的方法是執行回調中的所有邏輯,特別是最新一代的異步Java I/O API的工作方式。 –