簡體   English   中英

我可以在Java中編譯兩個相互依賴的類嗎?

[英]Can I compile two interdependent class in Java?

我有兩個文件,Utils.java和Gate.java。 例如

實用工具

package yao;
import yao.gate.Gate;

Gate.java

package yao.gate;
import yao.Utils;

Gate類使用Utils類的功能,而Utills類使用Gate類的功能。 我可以編譯這兩個相互依賴的文件,還是應該考慮更改代碼設計? 如果可能的話,請告訴我該怎么做?

有可能的。 但是,這聽起來不是一個好的設計。 創建一個新類,然后將通用代碼移至該類,並刪除兩個類之間的相互依賴性。

正如@Vlaxmi所提到的,根據一種代碼如何調用另一種代碼,在某些情況下它可能無法編譯。 但是至少有兩種方案可以編譯(沒有編譯錯誤)。 假設我有兩個類A和B,它們的包配置與您所描述的類似。

  • 情況1:來自類A實例的方法調用來自類B實例的方法,來自類B的另一個方法調用與類A的另一個方法。在這種情況下,編譯和執行一樣好

  • 情況2:來自類C實例的方法調用來自類B實例的方法,而來自類B的相同實例方法又依次調用來自類C的相同實例方法。編譯可以正常工作,但執行將最終出現StackOverflowError。

這是代碼中的插圖

一攬子相互依賴;

import interdependency.sub.*;
public class A {
    public void aM1() {
        System.out.println("In a.M1 method");
    }

    public void aM2() {
        System.out.println("In a.M2 method");
        B b = new B();
        b.bM2();
    }
}

這是B類:

package interdependency.sub;

import interdependency.A;

public class B {
    public void bM1() {
        System.out.println("In bM1 method:");
        A a = new A();
        a.aM1();
    }

    public void bM2() {
        System.out.println("In bM2 method");
    }
}

使用一個簡單的類來運行此方案

一攬子相互依賴;

import interdependency.sub.B;

public class InterdependencyTester {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        a.aM1();
        a.aM2();
        b.bM1();
        b.bM2();
        C c = new C();
        c.cM1();
    }
}

在此當前配置中,編譯和執行都可以正常工作。 這是第二種情況,雖然進展不順利,但是編譯仍然可以正常進行。

我們假設某個類C與其他兩個類相似:

package interdependency;

import interdependency.sub.B;

public class C {
    public void cM1() {
        System.out.println("inside cM1");
        B b = new B();
        b.bM3();    
    }
}

現在讓我們用第三種方法bM3更新B

package interdependency.sub;

import interdependency.A;
import interdependency.C;

public class B {
    public void bM1() {
        System.out.println("In bM1 method:");
        A a = new A();
        a.aM1();
    }

    public void bM2() {
        System.out.println("In bM2 method");
    }

    public void bM3() {
        System.out.println("In bM2 method");
        C c = new C();
        c.cM1();
    }
}

這次C.cM1呼叫B.bM3,而B.bM3呼叫C.cM1。 它可以編譯,但最終在運行時導致堆棧溢出

在此處輸入圖片說明

兩個相互依賴的類可以根據其復雜程度進行編譯。 例如,擁有兩個相互調用方法的類不是一個好設計。 這將導致死鎖代碼。 例如Utils.java

package yao;

import yao.gate.Gate;

public class Utils {
    Gate gate = new Gate();
    public void testUtils(){
        System.out.println("testUtils");
        gate.gateMethod();
    }
}

Gate.java

package yao.gate;

import yao.Utils;


public class Gate {
    Utils util = new Utils();
    public void gateMethod(){
        util.testUtils();
    }
}

暫無
暫無

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

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