2013-08-26 363 views
3

我需要將類型B的對象鏈接到類型A(循環依賴項)的任何實例。我也可以聲明另一個方法,它必須在A的構造函數之後調用,並將新的B鏈接到A實例。我想實現的是不必手動調用這種方法。這是示例代碼:使用self(this)在構造函數中調用構造方法 - 參數

public Class A{ 
    B b; 
    public A(){ 
     b = new B(this); // this does not work, 
         // as this references an object that has not been created yet 
    } 
} 

public Class B{ 
    A a; 
    public B(A a){ 
     this.a = a; //or something else 
    } 
} 

我評論了有問題的行。我也明白爲什麼它不能工作。我需要知道的是,如果有一個衆所周知的設計模式來避免這個問題?或者我應該重新設計我的班級模型,把B中的任何東西放到A中?有什麼建議麼?

+0

你必須學習依賴注入原則,它是Spring框架的核心,並且在那裏解決這些類型的問題 – Algorithmist

+0

你在做什麼?鑑於項目細節可能會影響不同的答案。 –

+0

您可能只需要使用set方法。我不知道你將如何在構造函數中做到這一點。 – taronish4

回答

4

確實工作。它的問題在於它在對象被完全初始化之前暴露了一個對象(因此如果B構造函數調用參數的方法,例如,這可能是一件壞事),但它的確可以工作工作。參考文獻B.a將參考已經/正在構建的A實例。

我會建議儘可能避免循環引用,但在替代方案更糟的情況下,您提供的代碼將起作用。

+0

在這種情況下我們不能考慮使用依賴注入嗎? – Algorithmist

+1

@Algorithmist:那麼如果這兩個字段實際上是'final',那麼依賴注入並沒有什麼實際的幫助 - 在引用對象的對象中得到兩個最終字段的唯一方法就是使用類似的東西。我們在這裏沒有足夠的背景來評論替代方案。 –

+0

@JonSkeet A類是一個圖類。有數據結構和方法來處理圖形(添加和刪除邊緣,等等)。 B類是一個度序列類,用一些方法來計算度序列,調整它們等等。在我的模型中,每個圖形對象都應該有一個度數序列對象,圖形本身應該是最終的。我不知道依賴對象是如何工作的,因爲度數序列可以在構建圖時首先計算,而度數序列應該在圖創建之後構建。 – yogii

1

不推薦使用此方法,因爲對象未完全初始化,可能會創建運行時異常。我們可以採取簡單的方案爲:

public class A { 
    B b; 
    String s; 
    public A(){ 
     b = new B(this); // this does not work, as this references an object that has not been created yet 
     s = "print me"; 
    } 
} 


public class B { 
    A a; 
    public B(A a){ 
     this.a = a; //or something else 
     System.out.println(this.a.s); // will same as a.s; 
    } 
} 

它將輸出null因爲部分初始化引用複製到構造函數。此代碼編譯是因爲編譯器在代碼中找不到任何缺失,因爲所有適當的引用和變量都在那裏。

相關問題