2012-03-29 220 views
3

我有一個類,裏面保存着另一個對象(List,Set和來自我的應用程序的對象)。在初始化中實例化對象?

public class SomeClass { 
    private List l; 
    private SomeObject obj; 
    //... 
} 

是一個很好的做法實例,其中SomeClass對象被創建,以避免NullPointerException異常這些對象呢?類似:

public class SomeClass{ 
    private List l = new ArrayList(); 
    private SomeObject obj = new SomeObject(); 
    //... 
} 

在正常的方式,這些對象將被在一些處理/分析null值生成的,但可能會發生錯誤,對象仍然。

回答

2

是的,這是一個很好的做法。構造函數是實例化成員對象的自然場所。您還可以創建他們的權利,他們的聲明:

private List l = new ArrayList(); 

但是,它可能是一個好主意,其中的方法是爲了以重組或使NullPointerException旨意不會出現修改代碼,無論調用。

+0

所有答案都不錯,但這是因爲修改代碼以避免NullPointerException而選擇的,我完全同意這一點。 – 2012-03-29 22:55:07

1

如果一個空的List或該類的默認對象在每個後續操作中都是有效狀態,那麼可以實例化一個默認值。但是,如果默認狀態是無效狀態,請不要這樣做。

1

嗯,我更喜歡初始化,因爲有時候很難找到空指針異常在哪裏,如果你用構造函數初始化對象,應該初始化裏面的對象。

希望這對你有所幫助。

1

通常是好做法實例成員字段(無論是對象或原語)在創建時當默認值(0,false或null)是不是你想要的。有一次推遲這是懶惰的實例化。 (例如,當一個對象可能不再需要而且創建它時代價昂貴時,就會使用它。)推遲這個的另一個時間是需要事先進行其他初始化的時候。

假設你想在初始化對象創建時間的字段,有兩種方法可以做到這一點:與初始化表達式爲你顯示或在構造函數(或多個)。沒有太多的區別,除了該實例初始化器在構造函數的第一行之前運行。這可能會或可能不會導致問題,具體取決於您的代碼邏輯。

無論何時在對象創建時初始化成員字段final並且預期在對象的生命期內不會更改,也是一個好主意。聲明字段final的一個好處是編譯器會捕獲任何初始化它的失敗。 (編譯器需要明確的分配以考慮final字段被正確初始化。)

1

您正在談論渴望建設與懶惰建設。有些地方每個人都有價值。

在許多情況下,最好是懶惰地創建東西,因爲它可以節省內存。但是,每次嘗試獲取數據時都必須檢查空值。

在某些情況下,爲了避免上面提到的空值檢查或避免在密集過程中創建對象創建時間,有必要預先創建對象進程

1

這樣生成它們是正常的,但它不是一個很好的代碼生成方式,只是爲了避免NPE。應該在代碼中進行適當的驗證,而不是分配不被利用的符合垃圾條件的對象。


您也可以將某些默認狀態 - 就像Collections.emptyList(),或 在常量類:

DEFAULT_STATE = new SomeState(); 

然後只需

class A { 
     State obj = Constants.DEFAULT_STATE; 
    }