maven循环依赖解析

时间:2017-10-27 01:10:10

标签: java maven dependencies

任何人都可以帮助解决我的应用程序中的这种循环依赖性错误。

这是我的情况:我有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 中,即使创建新模块和移动常用功能,我如何实现上述功能

2 个答案:

答案 0 :(得分:0)

如果类A需要实例化类B并且B需要实例化类A(意味着调用new A()等),这两个类必须在同一个模块中。所以你的建筑是不可能的。

我想,我想你的逻辑是可以实现的,但我不清楚你真正希望用你的决定实现什么?#34;和你的不同电话。

答案 1 :(得分:0)

鉴于您的代码不太现实,很难建议您如何重构代码。

以下是一些建议,希望可以为您提供灵感来处理您的真实问题

方法1:将A和B放在同一模块中

您可以将AB拉出作为常用模块。因此,AB之间的相互引用不是问题,因为它们位于同一模块中。原始module_amodule_b都取决于新的a_b_common模块(包含AB

方法2:打破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和功能界面来处理上述内容。这只是给您一个高层次的想法)