2012-04-26 18 views
1

これはどちらが優れているのか、正しいことですか(Googleで使用する検索用語はわかりませんでした)。変数をクラスまたはコンストラクタとして初期化しますか?

最初の方法:

Public Class A() 
{ 
    Paint _paint _test; 

    public void running() 
    { 
     _test = new Paint(); 
     //use paint 
    } 
} 

OR

Public Class B() 
{ 
    Paint _paint _test = new Paint(); 

    public void running() 
    { 
     //use paint 
    } 
} 

おかげ

+1

2つのうちどれもコンパイルされないということ以外は、どちらも有効であり、答えはコンテキストと達成しようとしているものによって異なります。 – assylias

+0

[コンストラクタ内または外部のコンストラクタ内で変数を初期化しますか?](http://stackoverflow.com/questions/3918578/should-i-initialize-variable-within-constructor-or-outside-constructor) – Lion

答えて

4

最初の方法は、あなたが(多分将来的には)おそらく例えば、メンバーのコンストラクタにパラメータを渡したいかもしれない時に優れていますメンバーのコンストラクタにパラメータを渡すと、あなたはすべてが例えば、このメンバーを初期化する必要があることを複数のコンストラクタがあります。

class Foo { 
    private Bar bar = new Bar(); 

    public Foo(String s){ ... } 
    public Foo(int i){ ... } 
    public Foo(double d){ ... } 
    public Foo(String s, int i){ ... } 
} 
-1

それは、それが使用される直前に初期化することが最善です。コンストラクタで常に必要または使用される変数のみを初期化します。あなたは、あなたがしたいことはありません知っているとき

class Foo{ 
    private Bar bar; 

    public Foo(){ 
     bar = new Bar(); 
    } 

    public Foo(String s){ 
     bar = new Bar(s); 
    } 
} 

第二の方法が優れている:

+0

だから?私は初期化する変数は常に使用されるので、クラスAは良いですか? –

+0

サービスクラスとDAOクラスの例を取ることができます。 daoクラスはサービスクラスで必要とされ、クラスBのように初期化する方が良いので、コンストラクタの引数に依存しません。 configパラメータがコンストラクタ引数に基づいて初期化される必要がある場合は、classBのアプローチに従います。いずれかの処理でArrayListが使用されている場合は、メソッド内で使用する直前に初期化する方がよいでしょう。 –

+0

-1。インスタンスメンバは常に使用されます。そうでない場合、インスタンスメンバは削除する必要があります。初期化と構築の目的はオブジェクトを使用可能な状態にすることです。あなたの発言はメソッドのローカル変数に適用されますが、「使用する直前に*宣言するのが最善です」と述べる方がよいでしょう。 – EJP

0

答えが「それが依存」です。あなたが説明した場合、おそらく2番目のオプションを使用するほうがよりエレガントです。しかし、値がコンストラクタパラメータの値を知る必要がある場合や、クラスの構築によって何らかの形で変更された場合は、おそらくコンストラクタで初期化する必要があります。メンバが宣言時に初期化できる場合は、そのメンバを宣言する必要があります。これにより、クラスが割り当てられたときに0またはNullに初期化する必要がなくなります。

関連する問題