2011-08-24 10 views
22

のメンバー変数を定義して初期化すると、クラス定義の最初にがメンバー変数を最初に定義し、コンストラクターのメンバー変数を初期化するのはどうですか?クラス定義の先頭またはコンストラクタでメンバ変数を初期化しますか?

言って、例えば:

public class Test { 
    private int foo = 123; 
    private boolean flag = false; 

    public void fooMethod() {...} 
} 

対:事前に

public class Test { 
    private int foo; 
    private boolean flag; 

    public Test() { 
     foo = 123; 
     flag = false; 
    } 

    public void fooMethod() {...} 
} 

感謝。

+1

[ベストプラクティス:コンストラクタまたは宣言でクラスフィールドを初期化するかどうかの可能な複製?](http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at) -declaration) –

答えて

17

あなたの例では、唯一の違いは初期化されている場合です。 JLSによれば、インスタンス変数はコンストラクタが呼び出される前に初期化されます。初期化の順序が必ずしもはっきりしないので、これは対処すべきスーパークラスがあるときに面白くなることがあります。これで、明示的なスーパーコンストラクタが呼び出されていないときに、 "スーパー"インスタンス変数が初期化されることに注意してください。

+0

+1と私は信じられないほど追跡するのは難しいバグのすべての種類を紹介想像... –

5

違いは、それらが初期化/設定される順序です。

あなたのクラスメンバ変数は、コンストラクタが呼び出される前に宣言/設定されます。私の個人的な好みは、コンストラクタでそれらを設定することです。

0

通常、コンストラクタは引数を受け入れ、それらの引数をクラスのフィールドに割り当てます。

public Test(int foo, boolean flag) 
{ 
    this.foo = foo; 
    this.flag = flag; 
} 
+0

あなたは何を意味するのか分かりませんか? –

+0

@aib、Java、C++ではありません。 – Triang3l

2

クラス内の初期化では、簡単なコンストラクタの作成を避けることができます。

あなたは、コンストラクタ内のコンストラクタのパラメータに依存インスタンスメンバを初期化する必要があります。同じコンストラクタ内の他のすべてのインスタンスメンバの初期化を行うことは、他に何もない場合は読みやすくするためには妥当かもしれません。

それ以外の場合は違いはありません。

関連する問題