Java - 在构造函数中初始化arraylist

时间:2014-07-23 13:44:44

标签: java arraylist constructor

我遇到过这段代码,我无法弄清楚它为什么在语法上有效:

return new ArrayList<Module>() {
   {
      add(new AModule());
      add(new BModule());
      add(new CModule());
   }
   private static final long serialVersionUID = -7445460477709308589L;
 };
  1. 什么是双{{for?
  2. 如何将静态final添加到类实例中?

2 个答案:

答案 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)

称为anonymous inner class

  

它们使您能够同时声明和实例化一个类。

由于他们从那里返回,他们只是匿名创建。

你看到那些双括号,因为一个用于类,另一个用于静态块。

他们看起来很像双支撑,但实际上

{  // class

    { // block inside the class

    }

}