Conjunto imutável em Java
1. Introdução
Neste tutorial,we’re going to have a look at different ways of constructing an immutable set in Java.
Mas, primeiro, vamos entender o conjunto imutável e ver por que precisamos dele.
2. O que é um conjunto imutável?
Em geral,an immutable object will not change its internal state once we create it. Isso o torna thread-safe por padrão. A mesma lógica se aplica a conjuntos imutáveis.
Vamos supor que temos uma instânciaHashSet com alguns valores. Tornar imutável criará uma versão “somente leitura” do nosso conjunto. Assim,any attempt to modify its state will throw UnsupportedOperationException.
Então, por que precisamos disso?
Certamente, o caso de uso mais comum de um conjunto imutável é um ambiente multithread. Portanto, podemos compartilhar dados imutáveis entre os threads, sem nos preocupar com a sincronização.
Enquanto isso, há um ponto importante a se ter em mente:immutability pertains only to the set and not to its elements. Além disso, podemos modificar as referências de instância dos elementos do conjunto sem problemas.
3. Crie conjuntos imutáveis no núcleo do Java
Com apenas as classes Java principais à nossa disposição, podemos usar o métodoCollections.unmodifiableSet() para envolver oSet original.
Primeiro, vamos criar uma instânciaHashSet simples e inicializá-la com os valoresString:
Set set = new HashSet<>();
set.add("Canada");
set.add("USA");
A seguir, vamos encerrar comCollections.unmodifiableSet():
Set unmodifiableSet = Collections.unmodifiableSet(set);
Finalmente, para garantir que nossa instânciaunmodifiableSet seja imutável, vamos criar um caso de teste simples:
@Test(expected = UnsupportedOperationException.class)
public void testUnmodifiableSet() {
// create and initialize the set instance
Set unmodifiableSet = Collections.unmodifiableSet(set);
unmodifiableSet.add("Costa Rica");
}
Como esperamos, o teste será executado com sucesso. Além disso, a operaçãoadd() é proibida na instânciathe unmodifiableSete lançaráUnsupportedOperationException.
Agora, vamos mudar a instância inicialset adicionando o mesmo valor a ela:
set.add("Costa Rica");
Dessa forma, modificamos indiretamente o conjunto não modificável. Então, quando imprimimos a instânciaunmodifiableSet:
[Canada, USA, Costa Rica]
Como podemos ver, o item“Costa Rica” também está presente emunmodifiableSet.
4. Crie conjuntos imutáveis em Java 9
Desde o Java 9, o método de fábrica estáticoSet.of(elements) está disponível para a criação de conjuntos imutáveis:
Set immutable = Set.of("Canada", "USA");
5. Crie conjuntos imutáveis em goiaba
Another way that we can construct an immutable set is by using Guava’s ImmutableSet class. Ele copia os dados existentes em uma nova instância imutável. Como resultado, os dados dentro deImmutableSet não mudarão quando alterarmos oSet original.
Como a implementação Java principal, qualquer tentativa de modificar a instância imutável criada lançaráUnsupportedOperationException.
Agora, vamos explorar diferentes maneiras de criar instâncias imutáveis.
5.1. UsandoImmutableSet. cópia de()
Simplificando, o métodoImmutableSet.copyOf() retorna uma cópia de todos os elementos no conjunto:
Set immutable = ImmutableSet.copyOf(set);
Portanto, após alterar o conjunto inicial, a instância imutável permanecerá a mesma:
[Canada, USA]
5.2. Usando ImmutableSet.of()
Da mesma forma, com o métodoImmutableSet.of(), podemos criar instantaneamente um conjunto imutável com os valores fornecidos:
Set immutable = ImmutableSet.of("Canada", "USA");
Quando não especificamos nenhum elemento, oImmutableSet.of() retornará um conjunto imutável vazio.
Isso pode ser comparado aSet.of(). do Java 9
6. Conclusão
Neste artigo rápido, discutimosSets imutável na linguagem Java. Moreover, we showed how to create immutable Sets using the Collections API from core Java, Java 9 and the Guava library.
Finalmente, como de costume, o código completo deste artigo está disponívelover on GitHub.