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

时间:2015-02-09 12:56:08

标签: java double-brace-initialize

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

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

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

// (2)
List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>();

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

此外,我想知道使用双支架初始化时是否存在某些缺点,我必须注意。

2 个答案:

答案 0 :(得分:10)

避免双括号初始化,因为它a)让同事惊讶并且难以阅读,b)损害性能和c)可能导致对象相等的问题(每个创建的对象都有一个唯一的类对象)。

如果你正在处理代码风格指南,那么这种技巧属于不要部分。

如果您真的希望能够内联创建列表和地图,请继续创建一些工厂方法。可能看起来像这样:

List l = Lists.of(
    Maps.of(new Entry("foo", "bar"), new Entry("bar", "baz")),
    Maps.of(new Entry("baz", "foobar"))
);

但是,Vangs示例确切地说明了示例的语法如何用于双括号初始化。

答案 1 :(得分:5)

这不是个好主意,因为它难以阅读,但你可以这样做:

List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>() {{
                    add(new HashMap<Object, Object>() {{
                        put(key, obj);
                    }});
                }};