0Pricing
Java Academy · Aula

EnumSet

Operações rápidas de conjunto com enums.

EnumSet é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.

O que é EnumSet

EnumSet é uma implementação especializada de Set exclusiva para tipos de enumeração.

Internamente, ele é um vetor de bits: cada constante corresponde a um bit. Isso o torna extremamente rápido e eficiente em termos de memória em comparação com um HashSet de enumerações.

import java.util.EnumSet;
import java.util.Set;

public class Main {
    enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
    public static void main(String[] args) {
        Set<Day> weekend = EnumSet.of(Day.SAT, Day.SUN);
        System.out.println(weekend);
    }
}

Criação com of

A fábrica EnumSet.of(...) cria um conjunto a partir das constantes listadas. Há sobrecargas para um a cinco elementos, além de uma versão com argumentos variáveis.

import java.util.EnumSet;

public class Main {
    enum Perm { READ, WRITE, EXECUTE }
    public static void main(String[] args) {
        EnumSet<Perm> perms = EnumSet.of(Perm.READ, Perm.WRITE);
        System.out.println(perms);
    }
}

allOf e noneOf

Mais duas fábricas:

  • allOf(Type.class) cria um conjunto contendo todas as constantes.
  • noneOf(Type.class) cria um conjunto vazio pronto para ser preenchido.
import java.util.EnumSet;

public class Main {
    enum Color { RED, GREEN, BLUE }
    public static void main(String[] args) {
        EnumSet<Color> all = EnumSet.allOf(Color.class);
        EnumSet<Color> none = EnumSet.noneOf(Color.class);
        none.add(Color.RED);
        System.out.println("all: " + all);
        System.out.println("built: " + none);
    }
}

range para constantes contíguas

EnumSet.range(from, to) inclui todas as constantes entre dois extremos, inclusive, na ordem de declaração.

import java.util.EnumSet;

public class Main {
    enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
    public static void main(String[] args) {
        EnumSet<Day> workdays = EnumSet.range(Day.MON, Day.FRI);
        System.out.println(workdays);
    }
}

complementOf

EnumSet.complementOf(set) retorna um conjunto com todas as constantes que não estão no conjunto fornecido.

Essa é uma maneira rápida de inverter uma seleção.

import java.util.EnumSet;

public class Main {
    enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
    public static void main(String[] args) {
        EnumSet<Day> work = EnumSet.range(Day.MON, Day.FRI);
        EnumSet<Day> rest = EnumSet.complementOf(work);
        System.out.println(rest);
    }
}

Operações de conjuntos

Como EnumSet é um Set real, você obtém união, interseção e diferença por meio de addAll, retainAll e removeAll.

Internamente, essas operações são executadas como operações bit a bit rápidas.

import java.util.EnumSet;

public class Main {
    enum Tag { A, B, C, D }
    public static void main(String[] args) {
        EnumSet<Tag> x = EnumSet.of(Tag.A, Tag.B, Tag.C);
        EnumSet<Tag> y = EnumSet.of(Tag.B, Tag.C, Tag.D);
        EnumSet<Tag> inter = EnumSet.copyOf(x);
        inter.retainAll(y);
        System.out.println("intersection: " + inter);
    }
}

Testes de pertinência

contains é uma única verificação de bit, portanto tem tempo constante e é muito rápido.

import java.util.EnumSet;

public class Main {
    enum Feature { DARK_MODE, BETA, ANALYTICS }
    public static void main(String[] args) {
        EnumSet<Feature> enabled = EnumSet.of(Feature.DARK_MODE, Feature.BETA);
        System.out.println(enabled.contains(Feature.BETA));
        System.out.println(enabled.contains(Feature.ANALYTICS));
    }
}

EnumSet como substituto de sinalizadores

Antes do EnumSet, os programadores usavam sinalizadores de bits int, como READ | WRITE. EnumSet substitui isso com segurança de tipos e legibilidade.

Você obtém o desempenho dos campos de bits sem o mascaramento manual sujeito a erros.

import java.util.EnumSet;
import java.util.Set;

public class Main {
    enum Style { BOLD, ITALIC, UNDERLINE }
    static void render(Set<Style> styles) {
        System.out.println("Applying: " + styles);
    }
    public static void main(String[] args) {
        render(EnumSet.of(Style.BOLD, Style.UNDERLINE));
    }
}

Iteração na ordem de declaração

EnumSet percorre as constantes na ordem natural, que é a ordem de declaração.

Isso proporciona uma iteração previsível e estável, ao contrário de HashSet.

import java.util.EnumSet;

public class Main {
    enum Phase { ALPHA, BETA, RC, GA }
    public static void main(String[] args) {
        EnumSet<Phase> set = EnumSet.of(Phase.GA, Phase.ALPHA, Phase.RC);
        for (Phase p : set) System.out.println(p);
    }
}

Cópias defensivas com copyOf

EnumSet.copyOf(collection) cria um EnumSet a partir de qualquer coleção de valores de enumeração. Use-o para criar uma cópia segura ou converter uma List.

import java.util.EnumSet;
import java.util.List;

public class Main {
    enum Role { ADMIN, EDITOR, VIEWER }
    public static void main(String[] args) {
        List<Role> source = List.of(Role.EDITOR, Role.VIEWER);
        EnumSet<Role> roles = EnumSet.copyOf(source);
        System.out.println(roles);
    }
}

Por que é rápido

Para enumerações com 64 constantes ou menos, EnumSet usa um único long como vetor de bits. Cada operação corresponde a uma ou duas instruções de máquina.

Prefira sempre EnumSet a HashSet<MyEnum> para conjuntos de enumerações.

import java.util.EnumSet;

public class Main {
    enum Bit { B0, B1, B2, B3 }
    public static void main(String[] args) {
        EnumSet<Bit> s = EnumSet.of(Bit.B0, Bit.B2);
        // contains is a single bit-and under the hood
        System.out.println(s.contains(Bit.B2));
    }
}

Verificação rápida

Teste seus conhecimentos sobre EnumSet.

Recapitulação

Você aprendeu sobre EnumSet:

  • Um Set de vetor de bits para enumerações, muito rápido e compacto.
  • Fábricas: of, allOf, noneOf, range, complementOf, copyOf.
  • Percorre os elementos na ordem de declaração.
  • O substituto com segurança de tipos para sinalizadores de bits int.

A seguir, o tipo de mapa correspondente: EnumMap.

import java.util.EnumSet;

public class Main {
    enum X { A, B }
    public static void main(String[] args) {
        System.out.println("EnumSet recap: " + EnumSet.allOf(X.class));
    }
}

Perguntas Frequentes

A aula “EnumSet” é grátis?

Sim — o texto completo de “EnumSet” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.

O que vou aprender em “EnumSet”?

Operações rápidas de conjunto com enums. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Java Academy?

Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “EnumSet”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Java Academy?

Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Enums com campos e métodos
  2. Métodos abstratos em enums
  3. EnumSet
  4. EnumMap
← Voltar para Java Academy