0Pricing
Java Academy · Lección

EnumSet

Operaciones rápidas de conjuntos sobre enums

EnumSet es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

¿Qué es EnumSet?

EnumSet es una implementación especializada de Set exclusiva para tipos enumeración.

Internamente es un vector de bits: cada constante corresponde a un bit. Esto la hace extremadamente rápida y eficiente en memoria frente a un HashSet de enumeraciones.

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);
    }
}

Crear conjuntos con of

La fábrica EnumSet.of(...) crea un conjunto a partir de las constantes indicadas. Hay sobrecargas para uno a cinco elementos, además de una versión varargs.

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 y noneOf

Hay dos fábricas más:

  • allOf(Type.class) crea un conjunto que contiene todas las constantes.
  • noneOf(Type.class) crea un conjunto vacío listo para rellenarse.
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 contiguas

EnumSet.range(from, to) incluye todas las constantes entre los dos extremos, ambos inclusive, en el orden de declaración.

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) devuelve un conjunto con todas las constantes que no están en el conjunto indicado.

Es una forma rápida de invertir una selección.

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);
    }
}

Operaciones de conjuntos

Como EnumSet es un Set real, dispone de unión, intersección y diferencia mediante addAll, retainAll y removeAll.

Internamente, estas operaciones se ejecutan mediante operaciones bit a bit muy 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);
    }
}

Comprobar pertenencia

contains solo comprueba un bit, por lo que se ejecuta en tiempo constante y es muy 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 alternativa a las banderas

Antes de EnumSet, los programadores usaban banderas de bits int como READ | WRITE. EnumSet las sustituye con seguridad de tipos y legibilidad.

Obtiene el rendimiento de los campos de bits sin el enmascaramiento manual propenso a errores.

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));
    }
}

Iteración en el orden de declaración

EnumSet itera en el orden natural de las constantes, que es su orden de declaración.

Esto proporciona una iteración predecible y estable, a diferencia 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);
    }
}

Copias defensivas con copyOf

EnumSet.copyOf(collection) construye un EnumSet a partir de cualquier colección de valores de una enumeración. Úselo para crear una copia segura o convertir una 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 qué es rápido

Para enumeraciones con 64 constantes o menos, EnumSet utiliza un único long como vector de bits. Cada operación requiere una o dos instrucciones de máquina.

Prefiera siempre EnumSet a HashSet<MyEnum> para conjuntos de enumeraciones.

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));
    }
}

Comprobación rápida

Compruebe sus conocimientos sobre EnumSet.

Repaso

Ha aprendido sobre EnumSet:

  • Un Set basado en un vector de bits para enumeraciones, muy rápido y compacto.
  • Fábricas: of, allOf, noneOf, range, complementOf y copyOf.
  • Itera en el orden de declaración.
  • Es el reemplazo con seguridad de tipos para las banderas de bits int.

A continuación, el tipo de mapa correspondiente: 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));
    }
}

Preguntas frecuentes

¿La lección «EnumSet» es gratis?

Sí — el texto completo de «EnumSet» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «EnumSet»?

Operaciones rápidas de conjuntos sobre enums Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «EnumSet»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Enums con campos y métodos
  2. Métodos abstractos en enums
  3. EnumSet
  4. EnumMap
← Volver a Java Academy