2011-05-20 100 views
1

這只是解決一段時間我偶然發現的爭議的一個簡單問題(對不起,我沒有鏈接)。聲明類對象的正確方法是什麼?

如何我已經聲明的對象是這樣:

class Foo { 

    private Bar aBar = new Bar(); 

    ... 

} 

現在,我找到了爭議說,這是不好的Java。我不知道他爲什麼這麼說,但他非常堅定。他提出的是所有的對象都應該在類體中聲明,但是直到構造函數纔會被實例化。任何人都可以爲我闡明這一點嗎?在構造函數中實例化對象確實更好嗎?

TFYT

〜Aedon

編輯1:

我知道,我用這個詞的爭議,但我不打算爲這是議論文。

+1

爲了避免使這個問題顯得主觀/爭議,您可能需要重新修改它以問「每種方式做這件事有什麼優點和缺點?」而不是問「什麼是正確的方法?」 – 2011-05-20 15:50:30

回答

4

在大多數情況下,這並不重要。我的經驗法則是:

  • 如果你要使用相同的表達式來初始化變量中的所有構造函數,它不依賴於任何參數,做到在聲明的地步。
  • 否則,你幾乎不得不在構造函數中這麼做。

推理:通過在聲明的時候初始化,這是該值將被分配相同的方式,無論構造和參數的明確。它還可以讓你的構造更簡單,並且沒有重複。

警告:不要分配在構造函數中的值,否則是無效的以前的清晰度:)

我建議你向你的同事(或其他)爲他的要求具體原因,你的目前的代碼是「壞」的。我確信有其他有效的替代觀點,但如果他不能提供任何理由,那麼沒有理由關注海事組織。

另一個要點 - 我假設沒有初始化的需要做任何顯著的工作。如果他們這樣做,這可能是一個混亂點,特別是如果引發異常。一般來說,我不喜歡我的構造函數做很多工作。

+0

太棒了,謝謝你的詳細解答。 – AedonEtLIRA 2011-05-20 16:07:49

2

通過構造函數指定屬性,它變得清醒時立即您實例化你的類將執行什麼樣的代碼。
如果您在字段聲明中分配內容,讀取類構造函數的人將不會意識到該字段是在別處設置的。

1

構造的合同是創建一個實例,它是語義有效。那就是所有的字段都被正確地初始化爲合理的值,等等。出於這個原因,初始化構造函數中的所有內容有助於澄清是什麼構成了您的類的有效實例。另外,像構造函數鏈接這樣的機制可以用來避免當你有多個構造函數時重複相同的代碼。

然而,這僅僅是一個教科書般的理論和現實生活中的你有時會做的更快捷的事情。因爲如果你在聲明的位置實例化對象,它幾乎沒有區別,所以不需要強大的位置導致爭議。

相關問題