Inicialização de Java Double Brace
1. Visão geral
Neste tutorial rápido, mostraremos como colchetes duplos podem ser usados paracreating and initializing objects in a single Java expression.
Também veremos por que essa técnica pode ser considerada um antipadrão.
2. Abordagem Padrão
Normalmente, inicializamos e preenchemos um conjunto de países da seguinte maneira:
@Test
public void whenInitializeSetWithoutDoubleBraces_containsElements() {
Set countries = new HashSet();
countries.add("India");
countries.add("USSR");
countries.add("USA");
assertTrue(countries.contains("India"));
}
Como pode ser visto no exemplo acima, estamos fazendo o seguinte:
-
Crie uma instância deHashSet
-
Adicione países aHashSet
-
Por fim, afirmamos se o país está presente naHashSet
3. Usando Chave Dupla
No entanto, podemos realmente combinar a criação e a inicialização em uma única declaração; é aqui que usamos colchetes duplos:
@Test
public void whenInitializeSetWithDoubleBraces_containsElements() {
Set countries = new HashSet() {
{
add("India");
add("USSR");
add("USA");
}
};
assertTrue(countries.contains("India"));
}
Como pode ser visto no exemplo acima, somos:
-
Criando uma classe interna anônima que estendeHashSet
-
Fornecer um bloco de inicialização de instância que invoca o método add e adiciona o nome do país aoHashSet
-
Finalmente, podemos afirmar se o país está presente noHashSet
4. Vantagens de usar chaves duplas
Existem algumas vantagens simples de usar chaves duplas:
-
Menos linhas de código em comparação com a maneira nativa de criação e inicialização
-
O código é mais legível
-
A inicialização da criação é feita na mesma expressão
5. Desvantagens de usar chaves duplas
As desvantagens do uso de chaves duplas são:
-
Maneira obscura e pouco conhecida de fazer a inicialização
-
Cria uma classe extra toda vez que a usamos
-
Não suporta o uso do "operador de diamante" - um recurso introduzido no Java 7
-
Não funciona se a classe que estamos tentando estender estiver marcada comofinal
-
Contém uma referência oculta à instância anexa, o que pode causar vazamentos de memória
É devido a essas desvantagens que a inicialização de chave dupla é considerada um antipadrão.
6. Alternativas
6.1. Métodos de fábrica de fluxo
Em vez disso, podemos fazer bom uso da nova API Java 8 Stream para inicializar nossoSet:
@Test
public void whenInitializeUnmodifiableSetWithDoubleBrace_containsElements() {
Set countries = Stream.of("India", "USSR", "USA")
.collect(collectingAndThen(toSet(), Collections::unmodifiableSet));
assertTrue(countries.contains("India"));
}
6.2. Métodos de fábrica de coleções Java 9
Além disso, o Java 9 trará um conjunto de métodos úteis de fábrica que possibilitarão o seguinte:
List list = List.of("India", "USSR", "USA");
Set set = Set.of("India", "USSR", "USA");
Você pode ler mais sobre estein this article.
7. Conclusão
Neste tutorial conciso, discutimos o uso de chaves duplas, além de suas vantagens e desvantagens.
A implementação desses exemplos pode ser encontrada emGitHub project - este é um projeto baseado em Maven, portanto, deve ser fácil de importar e executar como está.