2011-12-07 3 views
7

この質問にはJavaが少し強調されていますが、あらゆるOO言語に適用されます。 宣言でクラス変数を初期化することをお勧めしますか?それは明らかに私にとってはそうです。これは、愚かなヌルポインタ例外のミスのリスクを最小限に抑えます。例えばOO言語のオブジェクト属性を初期化するためのベストプラクティス

class myClass{ 

    private String name = "";// initialize here 

    public myClass(){ 

    //something 

    } 
} 

しかし、いくつかの教科書では、彼らはすぐに初期化するために気にしないでください。どちらが良いですか?それは問題ですか?

+0

これはクラス変数ではなく、インスタンス変数です。 –

+3

NPEの値は初期化された値よりも悪く、値が不正確または無効です。 –

+0

マークが正しいです。 NullPointerExceptionは、誤った値で暗黙的に失敗するよりも優れています。 –

答えて

5

インラインを初期化しない方が良い場合は、フィールドをさまざまな方法で初期化するコンストラクタが複数ある場合です。宣言でフィールドを初期化し、後で特定のコンストラクターに渡された値でその値を置き換えるのは非効率です。

3

これは繰り返し公開されていますので、サイトでさらに意見を求めてください。

Javaのための私の提案(これが唯一の特定の言語に意味があります):初期値は、クラスのために固定されている場合は

、その後、インラインを初期化します。

異なるコンストラクタが異なる初期値を設定する場合は、それぞれのコンストラクタで値を割り当てます。

C++ 11では状況が多少似ています。

0

これは、クラスの使用方法に完全に依存します。

たとえば、値クラスの場合がありますが、これは不変であることがよくあります。この場合、コンストラクタの値を設定するのが理想的です。

本当に分かりやすいデフォルト値がある場合は、宣言の時点でこれらを指定できます。予想されるデフォルト値が何であるかを見るのはかなり簡単です。 もちろん、別の値を代入することはできないので、これは上記のような最終フィールドでは機能しません。

もう1つの考慮点は、コンストラクタまたはミューテータ初期化の相対的なメリットに関するものです。コンストラクタの初期化を使用すると、インスタンスが一貫性のない状態になることはありませんが、ミューテータの初期化はより柔軟で、より簡単なAPIを提供します。

NPEを避けるという初期の発言では、上記のコードの行に沿って、コンストラクタの初期化を使用することが最善の方法だと思います。

関連する問題