EnumSet
Opérations rapides sur des ensembles d’énumérations
EnumSet est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.
Qu'est-ce qu'EnumSet ?
EnumSet est une implémentation spécialisée de Set, réservée aux types d'énumération.
En interne, il s'agit d'un vecteur de bits : chaque constante correspond à un bit. Cette représentation est extrêmement rapide et économe en mémoire par rapport à un HashSet d'énumérations.
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);
}
}Création avec of
La fabrique EnumSet.of(...) crée un ensemble à partir des constantes indiquées. Des surcharges existent pour un à cinq éléments, ainsi qu'une version acceptant un nombre variable d'arguments.
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 et noneOf
Deux autres fabriques sont disponibles :
allOf(Type.class)crée un ensemble contenant toutes les constantes.noneOf(Type.class)crée un ensemble vide prêt à être rempli.
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 pour les constantes contiguës
EnumSet.range(from, to) inclut toutes les constantes situées entre deux extrémités, bornes comprises, dans l'ordre de déclaration.
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) renvoie un ensemble contenant toutes les constantes qui ne figurent pas dans l'ensemble fourni.
C'est un moyen rapide d'inverser une sélection.
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);
}
}Opérations sur les ensembles
Puisque EnumSet est un véritable ensemble, vous disposez de l'union, de l'intersection et de la différence grâce à addAll, retainAll et removeAll.
En interne, ces opérations s'exécutent sous forme d'opérations bit à bit très rapides.
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);
}
}Tests d'appartenance
contains effectue un simple test de bit ; son temps d'exécution est donc constant et très court.
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 comme remplacement des indicateurs
Avant EnumSet, les programmeurs utilisaient des indicateurs de bits int comme READ | WRITE. EnumSet les remplace par une solution sûre du point de vue du typage et plus lisible.
Vous bénéficiez des performances des champs de bits sans le masquage manuel sujet aux erreurs.
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));
}
}Parcours dans l'ordre de déclaration
EnumSet parcourt les éléments dans l'ordre naturel des constantes, c'est-à-dire leur ordre de déclaration.
Le parcours est ainsi prévisible et stable, contrairement à celui d'un 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);
}
}Copies défensives avec copyOf
EnumSet.copyOf(collection) construit un EnumSet à partir de toute collection de valeurs d'énumération. Utilisez-le pour créer une copie sûre ou convertir une liste.
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);
}
}Pourquoi EnumSet est rapide
Pour les énumérations comportant au plus 64 constantes, EnumSet utilise un seul long comme vecteur de bits. Chaque opération correspond à une ou deux instructions machine.
Préférez toujours EnumSet à HashSet<MyEnum> pour les ensembles d'énumérations.
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));
}
}Vérification rapide
Vérifiez vos connaissances sur EnumSet.
Récapitulatif
Vous avez découvert EnumSet :
- Un
Setsous forme de vecteur de bits pour les énumérations, très rapide et compact. - Les fabriques :
of,allOf,noneOf,range,complementOfetcopyOf. - Le parcours respecte l'ordre de déclaration.
- Le remplacement sûr du point de vue du typage pour les indicateurs de bits int.
Ensuite, découvrez le type de structure correspondant : 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));
}
}Questions Fréquemment Posées
La leçon « EnumSet » est-elle gratuite ?
Oui — le texte complet de « EnumSet » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « EnumSet » ?
Opérations rapides sur des ensembles d’énumérations Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Java Academy ?
Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « EnumSet » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?
Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.