1.27 新的Class(…){{…}}初始化习惯用法的含义| Java Debug 笔记

233 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

Debug 笔记 <新的Class(…){{…}}初始化习惯用法的含义>

提问

{{ ... }}在以下代码中,block是什么意思?

class X {

    private Y var1;

    private X() {
        Z context = new Z(new SystemThreadPool()) {{
            var1 = new Y();
        }};
    }

}

回答一

这称为双花括号初始化

这意味着您正在创建一个匿名子类,并且双括号内的代码基本上是一个构造函数。它通常用于向集合中添加内容,因为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");

因此,在那种情况下它没有多大意义,而对于没有方便助手的Maps来说却没有多大意义。

回答二

大括号”表示您要创建一个匿名子类,第二个大括号是对象初始化器。

初始化程序在类的构造函数之前运行,但在任何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); }
}

如果初始化程序可以引发检查异常,则所有构造函数都必须声明它们可以引发异常。

回答三

您正在创建一个匿名类,并使用类Instance initializer惯用语,如下所示:

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 ")"
    }
}

文章翻译自Stack Overflow :stackoverflow.com/questions/7…