新类的含义(…){{…}}初始化成语
{{ ... }}
块在下面的代码中意味着什么?
class X { private Y var1; private X() { Z context = new Z(new SystemThreadPool()) {{ var1 = new Y(); }}; } }
它被称为双花括号初始化 。 (编辑:链接删除, 存档在这里 )
这意味着你正在创build一个匿名的子类,双花括号内的代码基本上是一个构造函数。 它通常用于向集合中添加内容,因为用于创build基本上集合常量的Java语法有点不方便。
所以你可能会这样做:
List<String> list = new ArrayList<String>() {{ add("one"); add("two"); add("three"); }};
代替:
List<String> list = new ArrayList<String>(); list.add("one"); list.add("two"); list.add("three");
我其实并不喜欢这样做,而宁愿这样做:
List<String> list = Arrays.asList("one", "two", "three");
所以在这种情况下没有什么意义,而对于没有方便的帮手的地图来说也没有什么意义。
“外部”大括号表示您正在创build一个匿名子类,第二个大括号是对象初始值设定项。 初始化器在类的构造函数之前运行,但在任何super
调用之后(因此也在任何超类初始化之后)运行。 您也可以在非匿名类中使用初始化器,如果您有几个不能相互调用的构造函数,或者需要比通常的字段初始化器允许更复杂的初始化的字段,那么这是启动final
字段的一种便捷方式。
考虑这个类:
class X extends Y{ private final int lulz; private static boolean someCondition(){...} private static boolean danger() throws SomeException { ... } public X(A a) throws SomeException { super(a); lulz = someCondition()? danger() : 0; } public X(B b) throws SomeException { super(b); lulz = someCondition()? danger() : 0; } }
它可以被重写为:
class X extends Y{ private final int lulz; private static boolean someCondition(){...} private static boolean danger() throws SomeException { ... } { // initalizer -- might throw SomeException! lulz = someCondition()? danger() : 0; } public X(A a) throws SomeException { super(a); } public X(B b) throws SomeException { super(b); } }
如果初始化器可以抛出一个检查exception,所有构造函数都必须声明它们可以抛出exception。
您正在创build一个匿名类,并使用类Instance initialize r idiom,如下所示:
class X { private Y var1; private X() { Z context = new Z( new SystemThreadPool()) { { // This is the initialize idiom var1 = new Y(); // } // } ); // BTW you are missing ")" } }
正如前面的答案中所提到的, 双花括号初始化是正确的。
它使用特定的技术来初始化 Java中的实例成员 。 这是在类定义中定义一个共享代码块的简便方法,当任何类构造函数被激活时,代码将会运行。
我将这个链接添加到官方的Java文档中来描述它,以获得关于这个主题的更广泛的观点。
从文档 :
实例variables的初始化块与静态初始化块相似,但没有static关键字:
{
// whatever code is needed for initialization goes here
}
Java编译器将初始化块复制到每个构造函数中。 因此,这种方法可以用来在多个构造函数之间共享一段代码。