新类的意义(...){{...}}初始化习语

这个问题在这里已经有了答案:

  • 什么是Java中的Double Brace初始化? 11个答案

  • 它被称为双花括号初始化。 (编辑:链接删除,存档在这里)

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

    所以在这种情况下没有太大的意义,但是对于没有方便助手的地图来说却没有多大意义。


    “外部”大括号表示您正在创建一个匿名子类,第二个大括号是对象初始值设定项。 初始化器在类的构造函数之前运行,但在任何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 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 ")"
        }
    }
    
    链接地址: http://www.djcxy.com/p/23981.html

    上一篇: Meaning of new Class(...){{...}} initialization idiom

    下一篇: Use FlurryAgent.onEvent(String eventId, Map<String, String> parameters)