Inicialização de Java Double Brace

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:

  1. Crie uma instância deHashSet

  2. Adicione países aHashSet

  3. 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:

  1. Criando uma classe interna anônima que estendeHashSet

  2. Fornecer um bloco de inicialização de instância que invoca o método add e adiciona o nome do país aoHashSet

  3. 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á.