2012-11-22 28 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(它在你的代码中唯一的原因是满足低层次的内部依赖)? –