2012-03-29 6 views
3

私は、その中に別のオブジェクト(List、Set、およびアプリケーションのオブジェクト)を保持するクラスを持っています。初期化でオブジェクトをインスタンス化しますか?

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

は良い練習がSomeClassオブジェクトはNullPointerExceptionが発生するのを回避するために作成され、これらのオブジェクトをインスタンス化しますか?ような何か:null値で、まだ通常の方法で

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

は、これらのオブジェクトは、いくつかの処理/解析で生成されますが、エラーが発生する可能性がありますとオブジェクト。

答えて

2

はい、そうすることをお勧めします。コンストラクタは、メンバオブジェクトをインスタンス化する自然な場所です。あなたはまた、彼らは宣言されている場所を右それらを作成することができます。しかし

private List l = new ArrayList(); 

、方法がされた順序に関係なく、再構築またはNullPointerException sが発生しないように、あなたのコードを変更するのは良い考えかもしれませんと呼ばれる。

+0

をこれは、NullPointerExceptionを避けるためにコードを変更すると言われています。これに完全に同意します。 –

1

Listまたはそのクラスのデフォルトのオブジェクトは、すべて以下の操作で有効な状態であれば、はい、デフォルトのインスタンスを作成。ただし、デフォルトが無効な状態になる場合は、実行しないでください。

1

さて、私は時々、NULLポインタ例外だ、とuは、コンストラクタを使ってオブジェクトを初期化した場合、オブジェクトが内部に初期化されるべき場所を見つけるための頭痛の種であるため、初期化することを好みます。

ご希望の場合はこちらをご覧ください。

1

それは、作成時にいつでもデフォルト値(0、偽、またはnull)のメンバフィールド(オブジェクトまたはプリミティブかどうか)をインスタンス化するために、一般的に良い練習だが、あなたが望むものではありません。これを延期するための時間は、遅延インスタンス化のためです。 (これは、例えば、オブジェクトが必要なくなり、作成が高価な場合などに使用されます)。これを延期する別の時間は、事前に他の初期化を行う必要がある場合です。

は、オブジェクトの作成時にフィールドを初期化したいと仮定すると、それを行うには2つの方法があります。初期化子式であなたが示したか、コンストラクタ(複数可)のように。インスタンスの初期化子がコンストラクタの最初の行の前に実行される以外は、それほど大きな違いはありません。これは、コードロジックに応じて、問題を引き起こす場合としない場合があります。

オブジェクト作成時に初期化され、オブジェクトの有効期間中は変更されないことが予想される場合はいつでも、メンバフィールドfinalを宣言することをお勧めします。フィールドfinalを宣言することの副次的な利点は、コンパイラが初期化の失敗をキャッチすることです。 (コンパイラは、finalフィールドを適切に初期化することを検討するために明確な割り当てが必要です。)

1

あなたは熱心な構築とレイジー構築について話しています。それぞれに価値がある場所があります。多くの状況で

、メモリを節約するようなまけものを作成することをお勧めします。ただし、データを取得しようとするたびにnullをチェックする必要があります。

上記のヌルチェックを避けるため、または集中的にオブジェクトを作成する時間を避けるために、オブジェクトを前もって作成するのが理にかなっています。プロセス

1

これを生成するのは正常ですが、NPEを避けるためにコードを生成するようにコードするのは良い方法ではありません。利用されないゴミに適格なオブジェクトを割り当てるのではなく、コードで適切な検証が行われるべきです。


あなたはまた、いくつかのデフォルトの状態に割り当てることができます - Collections.emptyList()、または定数クラスの のように:すべての答えは良いですが、その後

DEFAULT_STATE = new SomeState(); 

単に

class A { 
     State obj = Constants.DEFAULT_STATE; 
    } 
関連する問題