6

我最近发现在我看来是一种静态初始化 ArrayList 的新语法:
new ArrayList() {{ add("first"); add("second"); }};

我的问题是,那里到底发生了什么?这是定义静态块的快捷方式(我认为它需要static关键字)吗?或者只是一种定义默认构造函数的方法?还有什么?这成为有效的 Java 版本是什么?

一个解释加上进一步阅读的链接将不胜感激。

编辑:我的测试类,用于显示初始化程序块是在构造函数之前还是之后执行,如下所示。结果显示初始化程序块在其他构造函数代码之前执行:

import org.junit.Test;

public class InitializerBlockTest {
    class InitializerTest {
        {
        System.out.println("Running initalizer block");
        }

        public InitializerTest() {
            System.out.println("Running default constructor");
        }
    }

    class SubClass extends InitializerTest {
      {
        System.out.println("Running subclass Initializer block");
      }

      public SubClass()  {
        System.out.println("Running subclass constructor");
      }
    }

    @Test
    public void testIt() {
        new SubClass();
    }
}

输出:

Running initalizer block
Running default constructor
Running subclass Initializer block
Running subclass constructor
4

3 回答 3

7

您正在创建一个新的 ArrayList 匿名子类,并带有一个调用 add() 两次的实例初始化程序。

它与以下内容相同:

class MyList extends ArrayList
{

{ // This is an instance initializer; the code is invoked before the constructor.
add("first"); 
add("second");
}

public MyList() {
    super();
    // I believe initializers run here, but I have never specifically tested this
    }
}

...

List list=new MyList();

请注意,就我个人而言,我不建议将其作为成语使用,因为它会导致类文件爆炸。

于 2010-12-08T20:05:53.113 回答
4

它是实例变量的初始化块。

来自 Oracle 的文档:

实例变量的初始化块看起来就像静态初始化块,但没有 static 关键字:

{

    // whatever code is needed for initialization goes here
}

Java 编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。

请参阅:http: //download.oracle.com/javase/tutorial/java/javaOO/initial.html

于 2010-12-08T20:06:00.303 回答
3

当您编写时,new ArrayList() { }您正在创建ArrayList. 代码中最里面的括号中的{ }as 表示初始化程序块,实际上被复制到每个构造函数中。

编辑:你们肯定回答得很快!

于 2010-12-08T20:13:00.680 回答