Инициализация двойной скобки 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"));
}
Как видно из приведенного выше примера, мы делаем следующее:
-
Создайте экземплярHashSet
-
Добавьте страны вHashSet
-
Наконец, мы утверждаем, присутствует ли страна вHashSet
3. Использование двойной скобки
Тем не менее, мы можем фактически объединить создание и инициализацию в одном выражении; Здесь мы используем двойные скобки:
@Test
public void whenInitializeSetWithDoubleBraces_containsElements() {
Set countries = new HashSet() {
{
add("India");
add("USSR");
add("USA");
}
};
assertTrue(countries.contains("India"));
}
Как видно из приведенного выше примера, мы:
-
Создание анонимного внутреннего класса, расширяющегоHashSet
-
Предоставление блока инициализации экземпляра, который вызывает метод add и добавляет название страны вHashSet
-
Наконец, мы можем утверждать, присутствует ли страна в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, поэтому его должно быть легко импортировать и запускать как есть.