инициализация двойной скобки Java

Инициализация двойной скобки Java

1. обзор

В этом кратком руководстве мы покажем, как использовать двойные фигурные скобки дляcreating and initializing objects in a single Java expression.

Мы также посмотрим, почему эту технику можно рассматривать как антипаттерн.

2. Стандартный подход

Обычно мы инициализируем и заполняем набор стран следующим образом:

@Test
public void whenInitializeSetWithoutDoubleBraces_containsElements() {
    Set countries = new HashSet();
    countries.add("India");
    countries.add("USSR");
    countries.add("USA");

    assertTrue(countries.contains("India"));
}

Как видно из приведенного выше примера, мы делаем следующее:

  1. Создайте экземплярHashSet

  2. Добавьте страны вHashSet

  3. Наконец, мы утверждаем, присутствует ли страна вHashSet

3. Использование двойной скобки

Тем не менее, мы можем фактически объединить создание и инициализацию в одном выражении; Здесь мы используем двойные скобки:

@Test
public void whenInitializeSetWithDoubleBraces_containsElements() {
    Set countries = new HashSet() {
        {
           add("India");
           add("USSR");
           add("USA");
        }
    };

    assertTrue(countries.contains("India"));
}

Как видно из приведенного выше примера, мы:

  1. Создание анонимного внутреннего класса, расширяющегоHashSet

  2. Предоставление блока инициализации экземпляра, который вызывает метод add и добавляет название страны вHashSet

  3. Наконец, мы можем утверждать, присутствует ли страна вHashSet

4. Преимущества использования двойных скобок

Есть несколько простых преимуществ использования двойных скобок:

  • Меньше строк кода по сравнению с нативным способом создания и инициализации

  • Код более читабелен

  • Инициализация создания выполняется в том же выражении

5. Недостатки использования двойных скобок

Недостатки использования двойных скобок:

  • Неясный, не широко известный способ сделать инициализацию

  • Он создает дополнительный класс каждый раз, когда мы его используем

  • Не поддерживает использование «оператора бриллианта» - функция, представленная в Java 7

  • Не работает, если класс, который мы пытаемся расширить, отмечен какfinal

  • Содержит скрытую ссылку на включающий экземпляр, который может вызвать утечки памяти

Именно из-за этих недостатков инициализация двойной скобки рассматривается как анти-шаблон.

6. альтернативы

6.1. Методы фабрики потоков

Вместо этого мы можем эффективно использовать новый Java 8 Stream API для инициализации нашегоSet:

@Test
public void whenInitializeUnmodifiableSetWithDoubleBrace_containsElements() {
    Set countries = Stream.of("India", "USSR", "USA")
      .collect(collectingAndThen(toSet(), Collections::unmodifiableSet));

    assertTrue(countries.contains("India"));
}

6.2. Методы фабрики коллекций Java 9

Кроме того, Java 9 предоставит набор полезных фабричных методов, которые сделают возможным следующее:

List list = List.of("India", "USSR", "USA");
Set set = Set.of("India", "USSR", "USA");

Вы можете узнать больше об этомin this article.

7. Заключение

В этом кратком руководстве мы обсудили использование двойных скобок, а также его преимущества и недостатки.

Реализацию этих примеров можно найти вGitHub project - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.