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

8

我知道我可以使用双括号声明和初始化一个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
只需使用“正常”的初始化代码;双括号初始化很难阅读。代码是WORM(写一次,多次读取)。注意:如果这是一个静态列表,请使用静态初始化程序。 - fge
1
你为什么想要写那样的代码?你是独自工作吗? - kolossus
4
不要使用"双括号",因为每次这样做都会创建一个无用的ArrayList子类。 - Florent Bayle
@kolossus:为什么我不能把这个加入我的编码标准中? - Arvind Vishwakarma
1
可能是Java中的双括号初始化的重复问题。 - Rafael Winterhalter
2个回答

10

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

如果您正在编写代码风格指南,此类技巧应归于不要部分。

如果您真的想要能够在一行内创建列表和映射,则可以创建一些工厂方法。可以像这样:

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

然而,Vang的例子恰好展示了双重大括号初始化的语法,这也是你的例子所使用的语法。


1
双括号代码在测试中也可能出现问题。例如,如果xyz是静态初始化的,你该如何模拟它? - vikingsteve

5

这不是一个好主意,因为它很难阅读,但你可以采取以下措施:

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

@vang:感谢您的时间和回答,但是您没有初始化列表:( - Arvind Vishwakarma
2
你的意思是什么?那么新的 ArrayList<Map<Object,Object>>() 是什么? - Bracadabra
@Vang:我的意思是你给了我一个将对象放入映射中的想法...这很好,但我也想初始化我的列表。希望你明白 :) - Arvind Vishwakarma
2
Vangs的示例是正确的,并创建了一个List<Map<Object, Object>>,其中恰好有一个map,该map恰好有一个条目,即key: object - atamanroman
我恐怕我们彼此之间有所误解。顺便说一下,最好接受@atamanroman的答案。 - Bracadabra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接