java用双大括构造方式进行号初始化赋值操作

看到了一段奇怪的初始化ArrayList并赋值的代码,类似于

ArrayList<String> list = new ArrayList<String>(){
         
  {
	add("a");
	add("b");
	add("c");
}};
System.out.println(list);

就会输出[a, b, c]

我是第一次注意到有用 { {}} 的情形,不能理解,开始以为是黑科技,百度了一下发现原来如此。

如果是 new ArrayList<String>(){} 的形式,就是常见的匿名类。

现在两个大括号的写法,等于是在匿名类里加了一段代码块

new ArrayList<String>(){ {}}

这一段代码会编译出一个带$名的class,其实约等于下面的

static class ListTemp extends ArrayList{
    public ListTemp(){
        super();
    }
    {
        this.add("123");
    }
}
...
System.out.println(new ListTemp());
执行结果一样会输出123

创建对象时先执行构造方法,再执行代码块里的内容。

写起来很省事,但用的多了会编译出很多带$的class文件。

详细解释可见这篇文章

经验分享 程序员 微信小程序 职场和发展