簡體   English   中英

Maven循環依賴解析

[英]maven cyclic dependency resolution

任何人都可以幫助解決我的應用程序中的這種循環依賴性錯誤。

這是我的情況:我有2個需要根據決策者值相互通信的類,但是如果我嘗試在導致循環依賴項錯誤的類中添加依賴項,則這2個類將保留在不同的模塊中。

我正在計划的示例功能將與此類似

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內,即使創建新模塊並移動通用功能,我如何也可以實現上述功能

如果一個類A需要實例化類BB需要實例化類A (意味着調用new A()等),比這兩個類必須是相同的模塊中。 因此,您的構建是不可能的。

我想雖然可以實現您期望的邏輯,但是對我來說,您還不確定要通過“決策者”和不同的調用實現什么目標。

由於您的代碼不是很實際,因此很難建議您如何重構代碼。

這里有一些建議,希望可以給您啟發以解決您的實際問題

方法1:將A和B放在同一模塊中

您可以將AB拔出作為通用模塊。 因此, AB之間A相互引用不是問題,因為它們在同一模塊中。 原始的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和功能接口來完成上述工作。這只是給您一個高級的想法)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM