Двойная инициализация скобок с вложенными коллекциями
Я знаю, что могу объявить и инициализировать 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);
}});
}};