繁体   English   中英

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

[英]Java - initialize arraylist at the constructor

我遇到了这段代码,我不知道为什么它可以协同工作:

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

它定义了一个匿名类 ,它是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()));

这就是所谓的匿名内部类

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

由于他们是从那里回来的,所以他们只是匿名创建。

您会看到这些双括号,因为一个括号用于类,另一个括号用于其中的静态块。

他们看起来像双括号,但实际上

{  // class

    { // block inside the class

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM