2017-06-04 61 views
0

所以我不知道怎樣來寫這個所以我就在這裏給出一個例子:參數悖論? (不知道如何字)

public class test { 
    private Object1 o1; 
    private Object2 o2; 
    private Object3 o3; 

    public test() { 
     o1 = new Object1(o2, o3); 
     o2 = new Object2(o1); 
     o3 = new Object3(o1); 
    } 
} 

所以我的問題是,我需要給這3個對象的參數,這些方式和我得到的問題,因爲當我把o2和o3放在o1時,它們是空的。如果我嘗試在o1上方實例化o2和o3,則o1爲空,並且問題再次出現。有人可以幫我找到解決辦法。我還想將這三個對象分開(即不要給o2或o3一個o1字段)。

+0

對於你需要什麼樣的問題,那樣的初始化? –

+0

這是一個需要添加3個JPanel的JFrame,它們相互交互。 – L1ghtShadow

+1

先創建'JPanel's,然後在構建完成後放置屬性。否則你無法避免循環。此外,你的構造函數名稱('o1'等)必須與你的類名('Object1'等)匹配。你也應該遵循Java命名約定。 –

回答

1

你正面臨着circular dependency ,你需要不惜一切代價避免。

對於您的燃眉之急你可以構造不採取依靠的對象,定義了一套方法,創建空的構造對象,然後通過傳遞對象的set方法將它們連接在一起。

public class test { 
     private Object1 o1; 
     private Object2 o2; 
     private Object3 o3; 

     public test() { 
      o1 = new Object1(); 
      o2 = new Object2(); 
      o3 = new Object3(); 

      o1.setO2(o2); 
      o1.setO3(o3); 

      o2.setO1(o1); 
      o3.setO1(o1); 

     } 
    } 
+0

哦,這是一個很好的解決方案,謝謝你。 – L1ghtShadow

0

此問題的簡單解決方案是使用方法來啓動而不是構造函數。
定義方法假設init &使用默認的構造函數或無參數的構造函數。現在創建所有對象&以正確的順序調用所有對象的方法init

你可以在這裏做一兩件事。讓我們來看看...
您可以用兩個參數&定義方法,而不是一個參數的構造函數調用&從這兩個參數的構造該方法定義構造函數。所有的
首先定義在Object2 & Object3init方法。的Object1構造..

Object1(Object2 o2, Object3 o3){ 
    //Some code 
    o2.init(this); 
    o3.init(this); 
    //Some code 
} 

現在你的代碼來創建對象看起來像......

public class test { 
    private Object1 o1; 
    private Object2 o2; 
    private Object3 o3; 
    public test() { 
     o2 = new Object2(); 
     o3 = new Object3(); 
     o1 = new Object1(o2, o3); 
    } 
}