2017-03-27 45 views
0

我有兩個文件,Utils.java和Gate.java。例如我可以在Java中編譯兩個相互依賴的類嗎?

Utils.java

package yao; 
import yao.gate.Gate; 

Gate.java

package yao.gate; 
import yao.Utils; 

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

+0

你試過嗎? – Jens

+0

爲什麼你不試試,並告訴我是否可以這樣做 –

+0

我認爲它應該工作 –

回答

1

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

+0

但問題依然存在,這可能嗎? –

+0

可能有相互依賴的類。以上代碼不會出現編譯錯誤 - Utils.java 'package yao; import yao.gate.Gate;' Gate.java 'package yao.gate; import yao.Utils;'但是這也取決於哪個代碼被另一個被調用 – vlaxmi

+0

你能分享有編譯錯誤的代碼嗎? – vlaxmi

0

正如@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

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調用B.bM3和B.bM3調用C.cM1。它編譯但我們在運行時

enter image description here

0

兩個相互依存的類可以根據它有什麼樣的複雜程度編譯結束了一個堆棧溢出。例如有兩個類互相調用的方法並不是一個好的設計。這會導致代碼死鎖。 例如 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(); 
    } 
}