8

I know I can declare and initialize a List using double braces:

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

But I want a List of <Map<Object,Object>>:

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

How can I use double brace initialization (see (1)) with nested collections? My goal is to declare and initialize the data structure in a single line.

Also I would like to know if there are certain drawbacks when using double brace initialization I have to be aware of.

atamanroman
  • 11,607
  • 7
  • 57
  • 81

2 Answers2

10

Avoid double brace initialization as it a) surprises your colleagues and is hard to read, b) harms performance and c) may cause problems with object equality (each object created has a unique class object).

If you're working on a code style guide this kind of trickery belongs in the don't section.

If you really want to be able to create lists and maps inline, just go ahead and create a few factory methods. Could look like this:

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

However, Vangs example shows exactly how the syntax for your example is for double brace initialization.

atamanroman
  • 11,607
  • 7
  • 57
  • 81
  • 1
    Double brace code can also throw up issues in testing. How would you mock xyz if it is statically initialized, for example? – vikingsteve Feb 09 '15 at 13:25
5

It's not good idea, because it's hard to read, but you can do following:

List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>() {{
                    add(new HashMap<Object, Object>() {{
                        put(key, obj);
                    }});
                }};
Bracadabra
  • 3,609
  • 3
  • 26
  • 46