2012-11-22 31 views
0

可能重複:
Java calling methods from restricted layerJava的依賴觸發

免得說我有這樣的:

package org.service; 
import org.core; 

public class Service() 
{ 
    public void init() 
    { 
     Core core = new Core(); 
     core.callbackFunction(); 
    } 
    public void support() 
    { 
     ... 
    } 
} 

package org.core 
public class Core() 
{ 
    public void callbackFunction() 
    { 
     ... 
    } 

    public void useSerivice() 
    { 
     ... 
    } 
} 
  • 服務進口核心
  • 核心切不可導入服務

當調用來自Service的init()方法時,它調用core.callbackFunction()方法。

是否有可能爲callbackFunction提供一個參數,以便Core在執行support()方法時可以觸發的Service方法的引用。

例如:

時支持()從核心方法被調用它觸發主叫從服務方法。在調用Core的callbackFunction()方法時,從Service提供調用的方法列表。

我希望我的問題是可以理解的。

即時通訊使用Spring和Seam Fw。

+0

這是因爲這同一個問題: http://stackoverflow.com/questions/13508684/java-calling-methods-from-restricted-layer/13508776 –

+0

@akberc這似乎是相關的,但我不會不要說這是同一個問題。 –

回答

1

下面的設計如何?您在Service類中的bar()的實現可以根據需要調用其他方法。

public interface Foo { 
    void bar(); 
} 

public class Service implements Foo { 
    public void init() { 
     Core core = new Core(); 
     core.callbackFunction(this); 
    } 

    @Override 
    public bar() { 
     // impl here 
    } 
} 

public class Core() { 

    private Foo foo; 

    public void callbackFunction(Foo foo) { 
     this.foo = foo; 
    } 

    public void useService() { 
     if (foo != null) { 
      foo.bar(); 
     } else { 
      // Uh-oh. 
     } 
    } 
} 

我也強烈建議Foo實例傳遞在Core類的構造函數,以避免對if (foo != null)測試的需要。

+0

從原始帖子中可以看出Core.useService()將被調用,但這看起來像一個不錯的通用解決方案。我會改變一件事:服務實現Foo是一個破解封裝,你可以通過使用服務內部類的實例而不是「this」來修復(例如匿名但不一定是)。 –

+0

@DaveSyer它如何破解封裝?就Core而言,它只是接收一個'Foo',而不管它是一個內部類還是整個'Service'。或者我誤解了封裝(很可能!)? –

+0

這不是什麼大不了的事。考慮一下Service的業務客戶 - 他們是否真的需要Service作爲Foo(它在你的代碼中唯一的原因是滿足低層次的內部依賴)? –