任何人都可以帮助解决我的应用程序中的这种循环依赖性错误。
这是我的情况:我有2个类需要根据decider值相互通信,但是这2个类保留在不同的模块中如果我尝试在导致Cyclic Dependency错误的那些中添加依赖关系。
我计划的示例功能与此类似
class A {
void funA() {
System.out.print("Module A");
}
void Validate() {
boolean decider = true; // if true indicates belongs to Class A else B
if (decider) {
funA();
} else {
B b = new B();
b.funB();
}
}
private class B {
void funB() {
System.out.print("Module B");
}
void Validate() {
boolean decider = false;// if true indicates belongs to Class A else B
if (decider) {
funB();
} else {
A a = new A();
a.funA();
}
}
}
}
ClassA 保留在 ModuleA 和 ClassB 保持在 ModuleB 中,即使创建新模块和移动常用功能,我如何实现上述功能
答案 0 :(得分:0)
如果类A
需要实例化类B
并且B
需要实例化类A
(意味着调用new A()
等),这两个类必须在同一个模块中。所以你的建筑是不可能的。
我想,我想你的逻辑是可以实现的,但我不清楚你真正希望用你的决定实现什么?#34;和你的不同电话。
答案 1 :(得分:0)
鉴于您的代码不太现实,很难建议您如何重构代码。
以下是一些建议,希望可以为您提供灵感来处理您的真实问题
您可以将A
和B
拉出作为常用模块。因此,A
和B
之间的相互引用不是问题,因为它们位于同一模块中。原始module_a
和module_b
都取决于新的a_b_common
模块(包含A
和B
)
重构代码,使A和B不直接相互依赖。有很多方法,这里只是一个例子:
在公共模块中有Action
interface Action {
void perform();
}
让A不再依赖于B
class A {
Action fallbackAction; // setter etc
void validate() {
if xxxxx {
funcA();
} else {
fallbackAction.perform();
}
}
}
// similar for B
使用依赖注入,用
之类的东西构造A和B.A a = new A();
a.setFallbackAction(new Action(){
void perform() { new B().funcB(); }
} );
B b = new B();
b.setFallbackAction(new Action(){
void perform() { new A().funcA(); }
} );
(当然,您甚至可以在Java8中使用lambda和功能界面来处理上述内容。这只是给您一个高层次的想法)