Двойная инициализация скобок с вложенными коллекциями

Я знаю, что могу объявить и инициализировать 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 ответа

Избегайте двойной инициализации, так как это а) удивляет ваших коллег и плохо читается, б) ухудшает производительность и в) может вызвать проблемы с равенством объектов (каждый созданный объект имеет уникальный объект класса).

Если вы работаете над руководством по стилю кода, этот вид хитрости относится к разделу " не делать ".

Если вы действительно хотите создавать встроенные списки и карты, просто создайте несколько заводских методов. Может выглядеть так:

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

Тем не менее, пример Vangs точно показывает синтаксис вашего примера для инициализации с двойной скобкой.

Это не очень хорошая идея, потому что это трудно читать, но вы можете сделать следующее:

List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>() {{
                    add(new HashMap<Object, Object>() {{
                        put(key, obj);
                    }});
                }};
Другие вопросы по тегам