Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Double brace initialization with nested collections

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.

like image 669
Arvind Vishwakarma Avatar asked Feb 09 '15 12:02

Arvind Vishwakarma


1 Answers

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.

like image 108
atamanroman Avatar answered Sep 21 '22 19:09

atamanroman