Double braces инициализация
// Double braces initialization
List planets = new ArrayList<>() {{
add("Mercury");
add("Venus");
add("Earth");
add("Mars");
add("Jupiter");
add("Saturn");
add("Uranus");
add("Neptune");
}};
Double braces инициализация - это создание и инициализация объекта в одном java выражении. Чаще всего используется с коллекциями.
На самом деле в этот момент происходит создание анонимного внутреннего класса, расширяющего ArrayList и определение в нём блока инициализации экземпляра.
Плюсы: код выглядит проще, красивее и понятнее.Минусы:
- малоизвестный способ инициализации
- каждый раз создается дополнительный класс
- не работает, если класс, который мы пытаемся расширить, помечен как final
- содержит скрытую ссылку на внешний экземпляр, что может привести к утечкам памяти
Именно из за этих минусов данная инициализация является антипаттерном.
В современных версиях java есть более красивые и правильные варианты создания и инициализации коллекций. Начиная с Java 8 это Stream API.
// Stream (начиная с java 8)
List planets = Stream
.of("Mercury", "Venus", "Earth", "Mars",
"Jupiter", "Saturn", "Uranus", "Neptune")
.collect(Collectors.toList());
А начиная с java 9 конструкция List.of().
// начиная c java 9
List planets = List. of(
"Mercury", "Venus", "Earth", "Mars",
"Jupiter", "Saturn", "Uranus", "Neptune");