2012-03-20 86 views
0

給定兩個類,在彼此中創建每個類的對象會導致StackOverflow異常。這是一個JAVA項目順便說一句。給定兩個類,在另一個類中創建每個類的對象導致StackOverflow異常

我的項目中有多個類和其他類,我想我會創建另一個類的對象並使用它。

說我有班主和類圖形用戶界面。我在MAIN中創建了GUI對象並對其進行了初始化。同樣,我在GUI中創建了一個MAIN對象並初始化它。

現在這給了我一個堆棧溢出異常,因爲構造函數調用正深入到遞歸中。

我該怎麼辦?

我能想到的一種可能的解決方案是製作一個類STATIC的變量和方法。

任何其他解決方案?請建議。

回答

6

你應該通過你的一個類的實例,爲其他類的構造函數。

public class Main { 
    private final GUI gui; 
    Main() { 
     gui = new GUI(this); 
    } 
} 

public class GUI { 
    private final Main main; 
    public GUI(Main main) { 
     this.main = main; 
    } 
} 

你也可以使用setter而不是構造函數。我不太喜歡這個選項,因爲你失去了讓你的變量最終確定的能力。

public class Main { 
    private GUI gui; 
    Main() { 
    } 
    public void setGui(GUI gui) { 
     this.gui = gui; 
    } 
} 

public class GUI { 
    private Main main; 
    public GUI() { 
    } 
    public void setMain(Main main) { 
     this.main = main; 
    } 
} 

public static void main(String[] args) { 
    Main main = new Main(); 
    GUI gui = new GUI(); 
    main.setGui(gui); 
    gui.setMain(main); 
} 
+1

這是正確的,但它也是你通常應該做的方法靜態的,當他們不訪問任何本地信息的情況下 - 而且,作爲Jigar喬希下面提到的,它可以使感,使之成爲單例類如果你真的只需要你的整個應用程序中的一個。 – 2012-03-20 19:34:14

+0

但後來我有第三類RecieveThread訪問GUI類。我也需要一個物體。所以添加主參數將無法正常工作。 – 2012-03-20 19:43:15

+0

@AhishekNandgaonkar您可以將一個GUI對象添加到RecieveThread的構造函數中。如果關係變得足夠複雜,你可能希望使用創建所有沒有實例的類,然後創建初始化每個類的setter。然後構建所有選項並調用所有setter的一段代碼。 – 2012-03-20 19:47:43

0

單身? (它是否適合你的應用程序)

相關問題