4

別の開発者から入手したコードを調べているときに、次のコードに出くわしました。

public void myMethod()
{
    final MyClass data1 = new MyClass(1,2,3);
    final MyClass data2 = new MyClass(4,5,6);
    // [...]
    final MyClass dataN = new MyClass(M,O,P);

    ArrayList<MyClass> list = new ArrayList<MyClass>()
    {
        {
            add(data1);
            add(data2);
            // [...]
            add(dataN);
        }
    };
}

実際、私はこのコードが何をするか (list定義されたデータを入力すること) を知っていると思いますが、結果がどのように達成されるかに驚いています。特に、その場合の中括弧が何を{}意味するのか疑問に思っています。

私はこのコードがひどいことを知っています (考えますか?)。

私の推測は次のとおりです。

  • の最初のペア{}は、匿名オブジェクトの作成です。これは にキャストされArrayList<MyClass>ます。
  • 2番目のペア{}は-私が考えている-静的初期化に似たものですが、オブジェクト用です。それはある種の匿名コンストラクタでしょうか?

誰かがここで私にいくつかの洞察を教えてもらえますか? (Java ドキュメントのどこでそのような「構文マジック」を見つけることができますか?)

4

5 に答える 5

3

最初の括弧により、スーパー クラス ArrayList の無名の内部サブクラスを作成しています。2 番目の括弧は、たとえば匿名の内部クラスのインスタンスの初期化です。詳細については、このドキュメントをご覧ください。このブログには、インスタンスの初期化ブロックに関する適切な説明があります。

于 2013-02-21T12:15:35.007 に答える
2
ArrayList<MyClass> list = new ArrayList<MyClass>{     //anonymous of subclass
  {     //non-static initializer block
      System.out.prinln("...");
  }
};

最初に{}subclassnew ArrayList<MyClass>の新しい匿名を作成します。これは最終クラスではないArrayListため、ArrayList実行できます。

の 2 番目のペアは{}、新しいサブクラス内の非静的ブロックまたはインスタンス ブロックです。


Integer int1 = new Integer(10){};匿名クラスは最終クラスをサブクラス化できないため、これを試してもうまくいきませんInteger

于 2013-02-21T12:21:07.133 に答える
1

このコードは、ArrayListの匿名サブクラス({}の最初のペア)のインスタンスを作成します。これは相対的な質問です。匿名(内部)クラスはJavaでどのように使用されますか?

ネストされたブロックは、インスタンスの初期化ブロックです(http://docs.oracle.com/javase/tutorial/java/javaOO/initial.htmlを参照)。これは、インスタンスが作成されるときに、コンストラクター(任意のコンストラクター)が実行される前にこのコードが実行されることを意味します。

   {
        add(data1);
        add(data2);
        // [...]
        add(dataN);
    }
于 2013-02-21T12:22:26.393 に答える
1

このコードは、括弧が欠落していると機能しません (またはセミコロンですが、まったく異なる結果になります)。

final MyClass data1 = new MyClass(1,2,3);
final MyClass data2 = new MyClass(4,5,6);
// [...]
final MyClass dataN = new MyClass(M,O,P);

ArrayList<MyClass> list = new ArrayList<MyClass>()//here
{
    {
        add(data1);
        add(data2);
        // [...]
        add(dataN);
    }
};

最初の { は、ArrayList を拡張する新しいクラスを作成することを意味します。次の { は匿名ブロックを意味し、単にコードをグループ化します。編集:これは関数の外にあるため、オブジェクトの作成時に呼び出されます。

于 2013-02-21T12:15:05.967 に答える
0
 {
        {
            add(data1);
            add(data2);
            // [...]
            add(dataN);
        }
 };

これはインスタンス ブロックなので、ArrayList (リスト) のオブジェクトを作成した後、このコードが実行されます。各行でadd()メソッドが呼び出され、データが ArrayList に挿入され
ます。

ArrayList<MyClass> list = new ArrayList<MyClass>();
list.add(data1);
list.add(data2);
// [...]
list.add(dataN);

他の人が述べたように、doc はインスタンス ブロックの重要性を説明します。
最初に静的インスタンス ブロックが呼び出され、次にインスタンス ブロックが呼び出され、最後にコンストラクターが呼び出されます。静的インスタンス ブロックは 1 回だけ呼び出されますが、インスタンス ブロックとコンストラクターは新しいオブジェクトが作成されるたびに呼び出されます。

于 2013-02-21T12:31:19.050 に答える