我遇到过这段代码,我无法弄清楚它为什么在语法上有效:
return new ArrayList<Module>() {
{
add(new AModule());
add(new BModule());
add(new CModule());
}
private static final long serialVersionUID = -7445460477709308589L;
};
答案 0 :(得分:4)
它定义了一个匿名类,它是ArrayList的子类:
return new ArrayList<Module>() {
...
};
此子类包含实例初始值设定项块,即每次构造此类的实例时执行的代码块:
{
add(new AModule());
add(new BModule());
add(new CModule());
}
我会说这是一种不好的做法。定义一个新类只是为了能够向ArrayList添加内容是没用的。
只做
List<Module> list = new ArrayList<>();
list.add(new AModule());
list.add(new BModule());
list.add(new CModule());
return list;
或者,如果你使用番石榴:
List<Module> list = Lists.newArrayList(new AModule(), new BModule(), new CModule());
或者
List<Module> list = new ArrayList<>(Arrays.asList(new AModule(), new BModule(), new CModule()));
答案 1 :(得分:2)
它们使您能够同时声明和实例化一个类。
由于他们从那里返回,他们只是匿名创建。
你看到那些双括号,因为一个用于类,另一个用于静态块。
他们看起来很像双支撑,但实际上
{ // class
{ // block inside the class
}
}