Arv*_*rma 8 java double-brace-initialize
我知道我可以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))?我的目标是在一行中声明和初始化数据结构.
另外我想知道使用双支撑初始化时是否存在某些缺点我必须注意.
ata*_*man 10
避免双括号初始化,因为它a)让同事惊讶并且难以阅读,b)损害性能和c)可能导致对象相等的问题(每个创建的对象都有一个唯一的类对象).
如果您正在处理代码样式指南,那么这种技巧属于" 不要"部分.
如果您真的希望能够内联创建列表和地图,那么请继续创建一些工厂方法.看起来像这样:
List l = Lists.of(
Maps.of(new Entry("foo", "bar"), new Entry("bar", "baz")),
Maps.of(new Entry("baz", "foobar"))
);
Run Code Online (Sandbox Code Playgroud)
但是,Vangs示例确切地说明了示例的语法如何用于双括号初始化.
这不是一个好主意,因为它很难阅读,但你可以做到以下几点:
List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>() {{
add(new HashMap<Object, Object>() {{
put(key, obj);
}});
}};
Run Code Online (Sandbox Code Playgroud)