0Pricing
Java Academy · Lezione

EnumSet

Operazioni rapide sugli insiemi di enum

EnumSet è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.

Che cos'è EnumSet?

EnumSet è un'implementazione specializzata di Set esclusivamente per i tipi enum.

Internamente è un vettore di bit: ogni costante corrisponde a un bit. Questo lo rende estremamente veloce e poco dispendioso in termini di memoria rispetto a un HashSet di enum.

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

Creare un set con of

La factory EnumSet.of(...) crea un set a partire dalle costanti elencate. Sono disponibili overload da uno a cinque elementi, oltre a una versione 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 e noneOf

Altre due factory:

  • allOf(Type.class) crea un set contenente tutte le costanti.
  • noneOf(Type.class) crea un set vuoto pronto per essere riempito.
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 per costanti contigue

EnumSet.range(from, to) include tutte le costanti comprese tra due estremi, estremi inclusi, nell'ordine di dichiarazione.

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) restituisce un set contenente tutte le costanti non presenti nel set specificato.

È un modo rapido per invertire una selezione.

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

Operazioni sui set

Poiché EnumSet è un vero Set, offre unione, intersezione e differenza tramite addAll, retainAll e removeAll.

Internamente, queste operazioni vengono eseguite con la stessa rapidità delle operazioni bitwise.

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

Verificare l'appartenenza

contains consiste in un singolo controllo di bit, quindi ha tempo costante ed è molto veloce.

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 come alternativa ai flag

Prima di EnumSet, i programmatori usavano flag di bit int come READ | WRITE. EnumSet sostituisce questo approccio offrendo sicurezza dei tipi e leggibilità.

Si ottengono le prestazioni dei campi di bit senza il mascheramento manuale, soggetto a errori.

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

Iterazione nell'ordine di dichiarazione

EnumSet esegue l'iterazione secondo l'ordine naturale delle costanti, cioè il loro ordine di dichiarazione.

Questo garantisce un'iterazione prevedibile e stabile, a differenza di 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);
    }
}

Copie difensive con copyOf

EnumSet.copyOf(collection) costruisce un EnumSet a partire da qualsiasi collection di valori enum. Lo utilizzi per creare una copia sicura o per convertire 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);
    }
}

Perché è veloce

Per gli enum con 64 o meno costanti, EnumSet usa un singolo long come vettore di bit. Ogni operazione richiede una o due istruzioni macchina.

Preferisca sempre EnumSet a HashSet<MyEnum> per gli insiemi di enum.

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 rapida

Verifichi la Sua conoscenza di EnumSet.

Riepilogo

Ha imparato a usare EnumSet:

  • Un Set basato su un vettore di bit per gli enum, molto veloce e compatto.
  • Factory: of, allOf, noneOf, range, complementOf, copyOf.
  • Esegue l'iterazione nell'ordine di dichiarazione.
  • È l'alternativa sicura ai flag di bit int.

Prossimamente: il tipo di map corrispondente, 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));
    }
}

Domande Frequenti

La lezione «EnumSet» è gratuita?

Sì — il testo completo di «EnumSet» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.

Cosa imparerò in «EnumSet»?

Operazioni rapide sugli insiemi di enum Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Java Academy?

Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «EnumSet»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Java Academy?

Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Enum con campi e metodi
  2. Metodi astratti negli enum
  3. EnumSet
  4. EnumMap
← Torna a Java Academy