Java Academy · Les

EnumSet

Snelle setbewerkingen op enums

Les 3 van 413 stappen

EnumSet is een gratis Java Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

Wat is EnumSet?

EnumSet is een gespecialiseerde implementatie van Set, uitsluitend voor enumtypen.

Intern is het een bitvector: elke constante correspondeert met één bit. Daardoor is het vergeleken met een HashSet van enums extreem snel en geheugenefficiënt.

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

Maken met of

De fabrieksmethode EnumSet.of(...) maakt een set van de opgesomde constanten. Er zijn overbelaste varianten voor één tot en met vijf elementen, plus een versie met 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 en noneOf

Twee extra fabrieksmethoden:

  • allOf(Type.class) maakt een set met elke constante.
  • noneOf(Type.class) maakt een lege set die klaar is om te vullen.
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 voor aaneengesloten constanten

EnumSet.range(from, to) bevat alle constanten tussen twee eindpunten, inclusief de eindpunten, in declaratievolgorde.

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) retourneert een set met alle constanten die niet in de opgegeven set staan.

Dit is een snelle manier om een selectie om te keren.

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

Set-bewerkingen

Omdat EnumSet een echte Set is, krijg je unie, doorsnede en verschil via addAll, retainAll en removeAll.

Onder de motorkap worden deze uitgevoerd als snelle bitsgewijze bewerkingen.

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

Lidmaatschapscontroles

contains is één bitcontrole, waardoor de bewerking constante tijd kost en zeer snel is.

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 als vervanging voor vlaggen

Vóór EnumSet gebruikten programmeurs int-bitvlaggen zoals READ | WRITE. EnumSet vervangt dit door typeveiligheid en leesbaarheid.

Je krijgt de prestaties van bitvelden zonder het foutgevoelige handmatig maskeren.

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

Iteratie in declaratievolgorde

EnumSet doorloopt de constanten in hun natuurlijke volgorde, dus in declaratievolgorde.

Dit zorgt voor voorspelbare, stabiele iteratie, anders dan bij 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);
    }
}

Veilige kopieën met copyOf

EnumSet.copyOf(collection) maakt een EnumSet van elke verzameling enumwaarden. Gebruik dit om een veilige kopie te maken of een List te converteren.

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

Waarom het snel is

Voor enums met 64 of minder constanten gebruikt EnumSet één long als bitvector. Elke bewerking bestaat uit één of twee machine-instructies.

Geef altijd de voorkeur aan EnumSet boven HashSet<MyEnum> voor sets van enums.

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

Kennischeck

Toets je kennis van EnumSet.

Samenvatting

Je hebt geleerd hoe EnumSet werkt:

  • Een zeer snelle en compacte bitvector-Set voor enums.
  • Fabrieksmethoden: of, allOf, noneOf, range, complementOf en copyOf.
  • De iteratie volgt de declaratievolgorde.
  • De typeveilige vervanging voor int-bitvlaggen.

Vervolgens leer je het bijbehorende maptype: 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));
    }
}
Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “EnumSet” gratis?

Ja — de volledige tekst van “EnumSet” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “EnumSet”?

Snelle setbewerkingen op enums Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “EnumSet”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Enums met velden en methoden
  2. Abstracte methoden in enums
  3. EnumSet
  4. EnumMap
← Terug naar Java Academy