Java EnumSet: Criação, Operações e Dicas de Desempenho
Java EnumSet
Este guia orienta você na criação, manipulação e otimização de coleções Java EnumSet com exemplos de código práticos e insights de melhores práticas.
A classe EnumSet é uma implementação de conjunto de alta performance projetada exclusivamente para tipos enum. Ela implementa a interface java.util.Set e também herda Cloneable e Serializable, tornando-a versátil e eficiente.
Antes de mergulhar no EnumSet, certifique-se de estar confortável com enums Java, pois o conjunto é fortemente acoplado a um único tipo enum.
Criando um EnumSet
Diferente de outras implementações de set, EnumSet não expõe construtores públicos. Em vez disso, você usa seus métodos de fábrica estáticos para construir um conjunto.
1. Usando EnumSet.allOf()
O método allOf() cria um conjunto que contém toda constante do tipo enum especificado.
import java.util.EnumSet;
class Main {
enum Tamanho { PEQUENO, MEDIO, GRANDE, EXTRAGRANDE }
public static void main(String[] args) {
EnumSet<Tamanho> tamanhos = EnumSet.allOf(Tamanho.class);
System.out.println("EnumSet: " + tamanhos);
}
}
Saída
EnumSet: [PEQUENO, MEDIO, GRANDE, EXTRAGRANDE]
2. Usando EnumSet.noneOf()
Cria um conjunto vazio que pode conter apenas valores do tipo enum especificado.
import java.util.EnumSet;
class Main {
enum Tamanho { PEQUENO, MEDIO, GRANDE, EXTRAGRANDE }
public static void main(String[] args) {
EnumSet<Tamanho> tamanhos = EnumSet.noneOf(Tamanho.class);
System.out.println("EnumSet Vazio: " + tamanhos);
}
}
Saída
EnumSet Vazio: []
Nota: O conjunto resultante aceita apenas constantes Tamanho porque foi instanciado com Tamanho.class.
3. Usando EnumSet.range()
Constrói um conjunto contendo todas as constantes de enum de um limite inferior a um superior, inclusivo.
import java.util.EnumSet;
class Main {
enum Tamanho { PEQUENO, MEDIO, GRANDE, EXTRAGRANDE }
public static void main(String[] args) {
EnumSet<Tamanho> tamanhos = EnumSet.range(Tamanho.MEDIO, Tamanho.EXTRAGRANDE);
System.out.println("EnumSet: " + tamanhos);
}
}
Saída
EnumSet: [MEDIO, GRANDE, EXTRAGRANDE]
4. Usando EnumSet.of()
Cria um conjunto contendo uma ou mais constantes de enum específicas.
import java.util.EnumSet;
class Main {
enum Tamanho { PEQUENO, MEDIO, GRANDE, EXTRAGRANDE }
public static void main(String[] args) {
EnumSet<Tamanho> tamanhos1 = EnumSet.of(Tamanho.MEDIO);
System.out.println("EnumSet1: " + tamanhos1);
EnumSet<Tamanho> tamanhos2 = EnumSet.of(Tamanho.PEQUENO, Tamanho.GRANDE);
System.out.println("EnumSet2: " + tamanhos2);
}
}
Saída
EnumSet1: [MEDIO] EnumSet2: [PEQUENO, GRANDE]
Operações Comuns no EnumSet
Adicionando Elementos
add()– insere uma única constante de enum.addAll()– mescla outra coleção do mesmo tipo enum.
import java.util.EnumSet;
class Main {
enum Tamanho { PEQUENO, MEDIO, GRANDE, EXTRAGRANDE }
public static void main(String[] args) {
EnumSet<Tamanho> todos = EnumSet.allOf(Tamanho.class);
EnumSet<Tamanho> selecionados = EnumSet.noneOf(Tamanho.class);
selecionados.add(Tamanho.MEDIO);
System.out.println("Após add(): " + selecionados);
selecionados.addAll(todos);
System.out.println("Após addAll(): " + selecionados);
}
}
Saída
Após add(): [MEDIO] Após addAll(): [PEQUENO, MEDIO, GRANDE, EXTRAGRANDE]
Note que addAll() aceita qualquer Collection<Tamanho>, incluindo listas ou conjuntos, desde que contenham o mesmo tipo enum.
Iterando Elementos
Use um Iterator para percorrer o conjunto:
import java.util.EnumSet;
import java.util.Iterator;
class Main {
enum Tamanho { PEQUENO, MEDIO, GRANDE, EXTRAGRANDE }
public static void main(String[] args) {
EnumSet<Tamanho> tamanhos = EnumSet.allOf(Tamanho.class);
Iterator<Tamanho> it = tamanhos.iterator();
System.out.print("EnumSet: ");
while (it.hasNext()) {
System.out.print(it.next() + ", ");
}
}
}
Saída
EnumSet: PEQUENO, MEDIO, GRANDE, EXTRAGRANDE,
Removendo Elementos
remove()– deleta uma constante específica.removeAll()– limpa o conjunto quando passado a si mesmo.
import java.util.EnumSet;
class Main {
enum Tamanho { PEQUENO, MEDIO, GRANDE, EXTRAGRANDE }
public static void main(String[] args) {
EnumSet<Tamanho> tamanhos = EnumSet.allOf(Tamanho.class);
System.out.println("EnumSet: " + tamanhos);
boolean removido = tamanhos.remove(Tamanho.MEDIO);
System.out.println("MEDIO foi removido? " + removido);
boolean limpo = tamanhos.removeAll(tamanhos);
System.out.println("Todos elementos removidos? " + limpo);
}
}
Saída
EnumSet: [PEQUENO, MEDIO, GRANDE, EXTRAGRANDE] MEDIO foi removido? true Todos elementos removidos? true
Métodos Auxiliares Adicionais
| Método | Descrição |
|---|---|
copyOf() | Cria um novo EnumSet contendo os mesmos elementos. |
contains() | Verifica se uma constante específica está presente. |
isEmpty() | Retorna true se o conjunto não tem elementos. |
size() | Retorna o número de elementos. |
clear() | Remove todos os elementos. |
Cloneable e Serializable
EnumSet implementa Cloneable, permitindo criar uma cópia rasa via clone(). Também implementa Serializable, permitindo transmissão segura por redes ou persistência em disco.
Por Que Usar EnumSet?
Como EnumSet armazena seus valores como um vetor de bits, operações como add, remove e contains executam em tempo constante com overhead mínimo de memória. A JVM já conhece o conjunto exato de constantes possíveis para um dado enum, o que torna EnumSet muito mais eficiente que implementações genéricas como HashSet ou TreeSet.
Na prática, escolha EnumSet sempre que precisar de um conjunto de alta performance de valores enum.
Java
- Dominando Operadores Java: Tipos, Sintaxe e Exemplos Práticos
- Comentários em Java: Tipos, Uso e Boas Práticas
- Dominando o Loop for Aprimorado em Java: Sintaxe, Exemplos e Boas Práticas
- Dominando Strings em Java: Criação, Métodos e Boas Práticas
- Dominando Classes Internas Anônimas em Java: Definição, Sintaxe e Exemplos Práticos
- Dominando Enums em Java: Guia Completo de Enums e Enum Classes
- Construtores de Enum em Java Explicados com Exemplo Prático
- Dominando Try-With-Resources em Java: Gerenciamento Automático de Recursos Explicado
- Anotações em Java Explicadas: Tipos, Posicionamento e Exemplos Práticos
- Asserções em Java: Guia Prático para Detectar Bugs e Garantir Confiabilidade do Código