{{ ... }}Java中的Double Brace初始化语法()是什么?
{{ ... }}块在以下代码中的含义是什么?
class X {
private Y var1;
private X() {
Z context = new Z(new SystemThreadPool()) {{
var1 = new Y();
}};
}
}
Run Code Online (Sandbox Code Playgroud) 我知道这段代码:
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()会起作用?有没有导致问题的案例?
我知道我可以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))?我的目标是在一行中声明和初始化数据结构.
另外我想知道使用双支撑初始化时是否存在某些缺点我必须注意.
我有一个以下形式的嵌套集合:
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)
我想使用一个变量。
我怎样才能做到这一点?
我重构了以下对象初始化:
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字段
我认为这些代码示例应该是等效的 - 有什么区别?