0

開発者がさまざまな方法でクラス フィールドを初期化するのを見てきました。そのうちの3つが大人気!違いは何ですか?また、より適切なものはありますか?

class Test {
    ArrayList<String> myArr = new ArrayList<String>(); // First Method 
}


class Test {
    ArrayList<String> myArr;
    public Test() {
        myArr = new ArrayList<String>(); // Second Method
    }
}


class Test {
    ArrayList<String> myArr;
    public Test() {
    }
    public void Init() {
        myArr = new ArrayList<String>(); // Third Method
    }
}
4

4 に答える 4

4

1 と 2 は多かれ少なかれ同等でありfinal、フィールドで修飾子を使用することもできます。

(違いは、ケース 1 ではコンストラクターの呼び出し前にフィールドが初期化されるのに対し、ケース 2 ではコンストラクターの呼び出し時にフィールドが初期化されることです。)

3 は遅延初期化パターンです。

于 2012-06-19T12:08:30.680 に答える
1

最初と 2 番目の間に大きな違いはありません。違いはより構文的です。

最初のアプローチでは、宣言と定義を一緒に配置するため、変数の初期化を忘れることはありません。

2 番目と 3 番目のアプローチは、いくつかの条件に基づいて異なる方法で初期化する場合に、より柔軟に対応できます。

3 つ目は、パラメーターなしのコンストラクターを使用する必要があり、「実際の」初期化メソッド (必要なすべてのパラメーターを使用) を個別に呼び出すフレームワーク向けです。3 番目のアプローチでは、オブジェクトを初期状態に簡単に「リセット」することもできます。

finalフィールドがある場合、最初の割り当てが行われると再割り当てできず、コンストラクターの最後までに割り当てを行う必要があるため、最初または2番目のアプローチのみを使用できます

于 2012-06-19T12:09:31.773 に答える
1

1と2は同等ですが、変数が静的な場合、以下のコードのように動作が異なります

public class Test {
static String s="2"; // 1

Test()
{
    System.out.println(s);
    s="3"; //2
}

public static void main(String[] args) throws IOException {

    System.out.println("1="+s);
    new Test();
    System.out.println("1="+s); 
 }

1 では、クラスのロード時に初期化が行われますが、コンストラクター (2) で静的変数を初期化すると、オブジェクトの構築時に値が割り当てられます。

3)オンデマンドで変数を初期化しています。

class Test {
ArrayList<String> myArr;
public Test() {
}
public void Init() {
    myArr = new ArrayList<String>(); // Third Method
}
}
于 2012-06-19T12:29:44.467 に答える
0

それは制御と読みやすさについてです:

最初と 2 番目は同等です。

2 つ目は、初期化の順序を制御するのに役立ちます。

3 つ目は、クラスをテストし、すべてを作成したくない場合のように、遅延 (遅延初期化) を提供できます。

于 2012-06-19T12:09:45.673 に答える