标签: double-brace-initialize

280
推荐指数
8
解决办法
8万
查看次数

new Class(...){{...}}初始化习语的含义

{{ ... }}块在以下代码中的含义是什么?

class X {

    private Y var1;

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

}
Run Code Online (Sandbox Code Playgroud)

java initialization double-brace-initialize

44
推荐指数
2
解决办法
8819
查看次数

Java双支撑初始化工作总是如何?

我知道这段代码:

Set<String> set = new HashSet<String>() {{
  add("test1");
  add("test2");
}};
Run Code Online (Sandbox Code Playgroud)

是真的:

Set<String> set = new HashSet<String>() {
  {//initializer
    add("test1");
    add("test2");
  }
};
Run Code Online (Sandbox Code Playgroud)

初始化程序块正在构造函数块之前执行.在上面的示例中,在执行构造函数之前调用add("test1").构造函数可能正在初始化许多实例字段,因此这个类可以工作.我想知道为什么在构造函数之前调用.add()会起作用?有没有导致问题的案例?

java initializer double-brace-initialize

15
推荐指数
2
解决办法
625
查看次数

使用嵌套集合进行双括号初始化

我知道我可以List使用双括号声明和初始化:

// (1)
List<Object> myList = new ArrayList<object>(){{
    add("Object1");
    add("Object2");
}};
Run Code Online (Sandbox Code Playgroud)

但我想List<Map<Object,Object>>:

// (2)
List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>();
Run Code Online (Sandbox Code Playgroud)

如何使用嵌套集合的双括号初始化(参见(1))?我的目标是在一行中声明和初始化数据结构.

另外我想知道使用双支撑初始化时是否存在某些缺点我必须注意.

java double-brace-initialize

8
推荐指数
2
解决办法
649
查看次数

双大括号初始化的替代方案

我有一个以下形式的嵌套集合:

HashMap<String, HashMap<String, List<String>>> errorList;
Run Code Online (Sandbox Code Playgroud)

现在我使用双括号内联初始化它,如下所示

errorList.put(tempName, new HashMap<String, List<String>>() {{
    put("upl", new ArrayList<String>() {{ add("Y"); add("Upload Success"); }});
}});
Run Code Online (Sandbox Code Playgroud)

tempName这位于 foreach 循环中,每次迭代时值都会发生变化。我这样做是因为我无法使用List<String>or的实例HashMap<String,List<String>>,因为每次我更改该实例中的值时,它都会反映在它嵌套的集合中。所以我被迫使用双括号初始化创建新实例。

事情是:我想使用列表对象。代替

new ArrayList<String>() {{ add("Y"); add("Upload Success"); }}
Run Code Online (Sandbox Code Playgroud)

我想使用一个变量。

我怎样才能做到这一点?

java collections list hashmap double-brace-initialize

4
推荐指数
1
解决办法
2657
查看次数

Java双支撑初始化

我重构了以下对象初始化:

Req r = new Req();
r.set_f1("A");
r.set_f2(123);
r.set_f3(123.456);
Run Code Online (Sandbox Code Playgroud)

成:

Req r = new Req() {{
    set_f1("A");
    set_f2(123);
    set_f3(123.456)
}};
Run Code Online (Sandbox Code Playgroud)

第二个示例引发以下Eclipse警告:

serializable类不声明long类型的静态final serialVersionUID字段

我认为这些代码示例应该是等效的 - 有什么区别?

java eclipse double-brace-initialize

3
推荐指数
1
解决办法
420
查看次数