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