Pascal4eg

 Java | Фишки и трюки

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");