List<String> list = new ArrayList<String>(){ { add("hello"); remove(0); } };
map = new HashMap<String, Object>(){ { put("name","123"); } };
请问这个语法是来自 Java 几?他的原理又是什么?一个大括号我知道是匿名内部类,但是里面的大括号不知道是什么意思??
光阴似箭催人老,日月如移越少年。
この構文は、Java の 動的初期化ブロック と呼ばれます。
これはクラス内の中括弧で囲まれたコード スニペットであり、クラスがインスタンス化されるときに自動的に呼び出されます。
例:
その後、new Person() が呼び出されると、123 が出力されます。
new Person()
123
ご質問のコードに関しては、動的初期化ブロックが匿名クラスに配置されているだけなので、少し奇妙で理解しにくいように見えます。しかし、結局のところ、匿名クラスもクラスであるため、合法です。その結果、匿名クラスがインスタンス化されると、そのコードが実行され、いくつかの要素がコレクションに追加されます。これは、コレクションを初期化することと同じです。
Java のどのバージョンからサポートされていたかははっきりとは覚えていませんが、かなり前からサポートされていると推測され、Java 5 からサポートされているはずです。
最後に、この方法でコレクションを初期化するのは黒魔術のように見えます。
さらに、静的初期化ブロック をチェックして、その違いを比較することもできます。
内の波括弧は初期化ブロックで、新しい
中括弧は匿名内部クラスではなく、構築メソッドの前に実行される構築コードブロックであると思われます(明確に覚えていません)。
この構文は、Java の 動的初期化ブロック と呼ばれます。
これはクラス内の中括弧で囲まれたコード スニペットであり、クラスがインスタンス化されるときに自動的に呼び出されます。
例:
リーリーその後、
new Person()
が呼び出されると、123
が出力されます。ご質問のコードに関しては、動的初期化ブロックが匿名クラスに配置されているだけなので、少し奇妙で理解しにくいように見えます。しかし、結局のところ、匿名クラスもクラスであるため、合法です。その結果、匿名クラスがインスタンス化されると、そのコードが実行され、いくつかの要素がコレクションに追加されます。これは、コレクションを初期化することと同じです。
Java のどのバージョンからサポートされていたかははっきりとは覚えていませんが、かなり前からサポートされていると推測され、Java 5 からサポートされているはずです。
最後に、この方法でコレクションを初期化するのは黒魔術のように見えます。
さらに、静的初期化ブロック をチェックして、その違いを比較することもできます。
内の波括弧は初期化ブロックで、新しい
のコンストラクター呼び出しの間に実行されます。中括弧は匿名内部クラスではなく、構築メソッドの前に実行される構築コードブロックであると思われます(明確に覚えていません)。