Java EnumSet Class Example

📘 Premium Read: Access my best content on Medium member-only articles — deep dives into Java, Spring Boot, Microservices, backend architecture, interview preparation, career advice, and industry-standard best practices.

🎓 Top 15 Udemy Courses (80-90% Discount): My Udemy Courses - Ramesh Fadatare — All my Udemy courses are real-time and project oriented courses.

▶️ Subscribe to My YouTube Channel (176K+ subscribers): Java Guides on YouTube

▶️ For AI, ChatGPT, Web, Tech, and Generative AI, subscribe to another channel: Ramesh Fadatare on YouTube

EnumSet is a specialized Set implementation for use with enum types. It's part of the java.util package. Being a highly efficient, compact alternative to traditional sets, it is designed to provide all of the richness of the traditional Set interface without the time and space overheads.

Key Points: 

Optimized for Enums: EnumSet is specifically designed for use with enum types. 

Performance: It's implemented as a bit-vector, which makes it extremely efficient (faster than HashSet). 

Not Thread-Safe: EnumSet itself is not thread-safe. External synchronization is needed if multiple threads modify an enum set concurrently and at least one of the threads modifies it. 

Nulls: EnumSet does not permit the use of null elements.

Common Operations with EnumSet in Java

import java.util.EnumSet; // Define an enumeration for days of the week enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } public class EnumSetDemo { public static void main(String[] args) { // 1. Initialization using allOf EnumSet<Day> allDays = EnumSet.allOf(Day.class); System.out.println("All days: " + allDays); // 2. Initialization using noneOf EnumSet<Day> noDays = EnumSet.noneOf(Day.class); System.out.println("No days: " + noDays); // 3. Initialization with specific days EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY); System.out.println("Weekend days: " + weekend); // 4. Initialization with a range EnumSet<Day> weekdays = EnumSet.range(Day.MONDAY, Day.FRIDAY); System.out.println("Weekdays: " + weekdays); // 5. Using complementOf to get the opposite of a specific set EnumSet<Day> notWeekend = EnumSet.complementOf(weekend); System.out.println("Not weekend days: " + notWeekend); } } 

Output:

All days: [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY] No days: [] Weekend days: [SATURDAY, SUNDAY] Weekdays: [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY] Not weekend days: [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY] 

Explanation:

1. allOf: Creates an EnumSet containing all the constants of the specified enumeration class.

2. noneOf: Creates an empty EnumSet with the specified element type.

3. of: Creates an EnumSet with the specified constants. Here, it's used to initialize the weekend with SATURDAY and SUNDAY.

4. range: Creates an EnumSet ranging from the specified constant start to end. Here, it's used to create a set with all weekdays.

5. complementOf: Creates an EnumSet with elements not present in the specified set. In this case, it returns all days except the weekend.

Real-World Use Case: Managing User Permissions with EnumSet

import java.util.EnumSet; // Define an enumeration for permissions enum Permission { READ, WRITE, EXECUTE, DELETE } class User { private String name; private EnumSet<Permission> permissions; public User(String name, EnumSet<Permission> permissions) { this.name = name; this.permissions = permissions; } public boolean hasPermission(Permission permission) { return permissions.contains(permission); } @Override public String toString() { return name + " has permissions: " + permissions; } } public class PermissionManager { public static void main(String[] args) { // 1. Granting all permissions User admin = new User("Admin", EnumSet.allOf(Permission.class)); System.out.println(admin); // 2. Granting read-only permission User guest = new User("Guest", EnumSet.of(Permission.READ)); System.out.println(guest); // 3. Checking user permissions System.out.println("Admin has WRITE permission: " + admin.hasPermission(Permission.WRITE)); System.out.println("Guest has WRITE permission: " + guest.hasPermission(Permission.WRITE)); } } 

Output:

Admin has permissions: [READ, WRITE, EXECUTE, DELETE] Guest has permissions: [READ] Admin has WRITE permission: true Guest has WRITE permission: false 

Explanation:

1. The Permission enum lists the different types of permissions a user can have. Using EnumSet, we can efficiently represent a combination of these permissions.

2. The User class uses an EnumSet to store the permissions granted to the user. The hasPermission method checks if a specific permission is present in the user's EnumSet of permissions.

3. In the PermissionManager class:

- An admin user is granted all permissions using EnumSet.allOf(Permission.class).

- A guest user is granted only the read permission using EnumSet.of(Permission.READ).

- We then check and print whether each user has the WRITE permission.

Comments

Spring Boot 3 Paid Course Published for Free
on my Java Guides YouTube Channel

Subscribe to my YouTube Channel (165K+ subscribers):
Java Guides Channel

Top 10 My Udemy Courses with Huge Discount:
Udemy Courses - Ramesh Fadatare