Class EnumSet<E>
Lớp EnumSet trong Java là một triển khai đặc biệt của Set được thiết kế để làm việc với các kiểu enum, giúp quản lý các giá trị enum một cách an toàn, hiệu quả và thuận tiện. Lớp này kế thừa từ lớp AbstractSet và triển khai giao diện Set.
Một số đặc điểm nổi bật của Class EnumSet<E>
↳ Hiệu suất cao: EnumSet được biểu diễn nội bộ dưới dạng các bit vector, giúp tiết kiệm không gian và cải thiện hiệu suất so với các tập hợp truyền thống sử dụng int-based "bit flags."
↳ Duyệt theo thứ tự tự nhiên: Bộ lặp (iterator) của EnumSet duyệt qua các phần tử theo thứ tự tự nhiên của chúng (thứ tự khai báo của các hằng số enum).
↳ Không cho phép giá trị null: EnumSet không cho phép chèn giá trị null. Nếu cố gắng chèn hoặc kiểm tra sự hiện diện của null, nó sẽ ném ra NullPointerException.
↳ Không đồng bộ hóa: EnumSet không đồng bộ hóa, vì vậy nếu nhiều luồng truy cập đồng thời vào EnumSet và một trong số chúng thực hiện thao tác thay đổi tập hợp, cần phải đồng bộ hóa bên ngoài.
Khai báo Class EnumSet<E> trong Java
Để sử dụng Class EnumSet<E>, bạn cần import gói java.util vào đầu file Java của mình. Gói này cung cấp các lớp và giao diện để làm việc với các collection trong Java.
Cú pháp câu lệnh import:
Cú pháp
import java.util.EnumSet;
Cú pháp khai báo Class EnumSet<E>:
Cú pháp
public abstract class EnumSet<E extends Enum<E>>
extends AbstractSet<E>
implements Cloneable, Serializable
Dưới đây là giải thích chi tiết về cú pháp khai báo này:
↳ public: Lớp EnumSet có thể được truy cập từ bất kỳ đâu trong chương trình.
↳ abstract class: Đây là một lớp trừu tượng, nghĩa là không thể tạo đối tượng trực tiếp từ EnumSet. Nó cung cấp một phần cài đặt và yêu cầu các lớp con hoàn thiện.
↳ EnumSet<E extends Enum<E>>: Sử dụng generics có ràng buộc, E phải là một kiểu enum (liệt kê) cụ thể. Ví dụ: EnumSet<Day> nếu Day là enum.
↳ extends AbstractSet<E>: Lớp EnumSet Kế thừa lớp AbstractSet, tức là EnumSet là một dạng của Set – tập hợp không chứa phần tử trùng nhau.
↳ implements Cloneable: EnumSet triển khai giao diện Cloneable, Cho phép EnumSet được sao chép bằng phương thức clone().
↳ implements Serializable: EnumSet triển khai giao diện Serializable, Cho phép EnumSet được tuần tự hóa, có thể ghi xuống file hoặc truyền qua mạng.
Các phương thức chính trong lớp EnumSet
Lớp EnumSet cung cấp các phương thức để tạo và thao tác với các enum set một cách hiệu quả. Nó là một cách tiện lợi để làm việc với các tập hợp các giá trị enum. Dưới đây là danh sách tất cả các phương thức của Class EnumSet<E> trong Java:
↳ static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType): Tạo một enum set chứa tất cả các phần tử trong kiểu phần tử đã cho.
↳ EnumSet<E> clone(): Trả về một bản sao của set này.
↳ static <E extends Enum<E>>EnumSet<E> complementOf(EnumSet<E> s): Tạo một enum set với cùng kiểu phần tử như enum set đã cho, ban đầu chứa tất cả các phần tử của kiểu này không có trong set đã cho.
↳ static <E extends Enum<E>> EnumSet<E> copyOf(Collection<E> c): Tạo một enum set được khởi tạo từ bộ sưu tập đã cho.
↳ static <E extends Enum<E>> EnumSet<E> copyOf(EnumSet<E> s): Tạo một enum set với cùng kiểu phần tử như enum set đã cho, ban đầu chứa các phần tử giống nhau (nếu có).
↳ static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType): Tạo một enum set rỗng với kiểu phần tử đã cho.
↳ static <E extends Enum<E>> EnumSet<E> of(E e): Tạo một enum set ban đầu chứa phần tử đã cho.
↳ static <E extends Enum<E>> EnumSet<E> of(E first, E... rest): Tạo một enum set ban đầu chứa các phần tử đã cho.
↳ static <E extends Enum<E>> EnumSet<E> of(E e1, E e2): Tạo một enum set ban đầu chứa các phần tử đã cho.
↳ static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3): Tạo một enum set ban đầu chứa các phần tử đã cho.
↳ static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4): Tạo một enum set ban đầu chứa các phần tử đã cho.
↳ static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5): Tạo một enum set ban đầu chứa các phần tử đã cho.
↳ static <E extends Enum<E>> EnumSet<E> range(E from, E to): Tạo một enum set ban đầu chứa tất cả các phần tử trong phạm vi được xác định bởi hai điểm cuối đã cho.
Dưới đây là một ví dụ đơn giản về cách sử dụng EnumSet:
Ví dụ: Example.java
import java.util.EnumSet;
enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
public class Example {
public static void main(String[] args) {
// Tạo EnumSet chứa tất cả các ngày trong tuần
EnumSet<Day> allDays = EnumSet.allOf(Day.class);
// Tạo EnumSet chứa các ngày cuối tuần
EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY);
// Tạo EnumSet chứa các ngày trong tuần
EnumSet<Day> weekdays = EnumSet.range(Day.MONDAY, Day.FRIDAY);
// In tất cả các ngày
System.out.println("Tất cả các ngày trong tuần:");
for (Day day : allDays) {
System.out.println(day);
}
// In các ngày cuối tuần
System.out.println("\nCác ngày cuối tuần:");
for (Day day : weekend) {
System.out.println(day);
}
// In các ngày trong tuần
System.out.println("\nCác ngày trong tuần:");
for (Day day : weekdays) {
System.out.println(day);
}
}
}
Kết quả của chương trình là:
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
Các ngày cuối tuần:
SUNDAY
SATURDAY
Các ngày trong tuần:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
Ví dụ về cách sử dụng EnumSet trong Java với các lớp do người dùng tự định nghĩa
Dưới đây là ví dụ về cách sử dụng EnumSet trong Java với các lớp do người dùng tự định nghĩa. Trong ví dụ này, chúng ta sẽ sử dụng một enum để định nghĩa các loại sự kiện và sử dụng EnumSet để quản lý các sự kiện đó.
Ví dụ: Example.java
import java.util.EnumSet;
// Enum định nghĩa các loại sự kiện
enum EventType {
CONCERT,
CONFERENCE,
WORKSHOP,
MEETING
}
public class Example {
public static void main(String[] args) {
// Tạo một EnumSet với các loại sự kiện
EnumSet<EventType> eventSet = EnumSet.noneOf(EventType.class);
// Thêm các loại sự kiện vào EnumSet
eventSet.add(EventType.CONCERT);
eventSet.add(EventType.WORKSHOP);
// Kiểm tra sự có mặt của một loại sự kiện
if (eventSet.contains(EventType.CONCERT)) {
System.out.println("EventType CONCERT có trong EnumSet.");
}
// Xóa một loại sự kiện
eventSet.remove(EventType.WORKSHOP);
if (!eventSet.contains(EventType.WORKSHOP)) {
System.out.println("EventType WORKSHOP đã bị xóa khỏi EnumSet.");
}
// Hiển thị tất cả các loại sự kiện trong EnumSet
System.out.println("Danh sách các loại sự kiện hiện có trong EnumSet:");
for (EventType eventType : eventSet) {
System.out.println(eventType);
}
// Thêm tất cả các loại sự kiện vào EnumSet
eventSet.addAll(EnumSet.allOf(EventType.class));
System.out.println("Danh sách các loại sự kiện sau khi thêm tất cả:");
for (EventType eventType : eventSet) {
System.out.println(eventType);
}
// Tạo một EnumSet chỉ chứa một số loại sự kiện cụ thể
EnumSet<EventType> specificEvents = EnumSet.of(EventType.CONFERENCE, EventType.MEETING);
System.out.println("Danh sách các loại sự kiện cụ thể:");
for (EventType eventType : specificEvents) {
System.out.println(eventType);
}
}
}
Kết quả của chương trình là:
EventType WORKSHOP đã bị xóa khỏi EnumSet.
Danh sách các loại sự kiện hiện có trong EnumSet:
CONCERT
Danh sách các loại sự kiện sau khi thêm tất cả:
CONCERT
CONFERENCE
WORKSHOP
MEETING
Danh sách các loại sự kiện cụ thể:
CONFERENCE
MEETING
Như vậy, chúng ta đã tìm hiểu các phương thức chính của lớp EnumSet. Với khả năng làm việc cực kỳ hiệu quả và an toàn kiểu (type-safe) với các tập hợp giá trị enum, EnumSet là lựa chọn lý tưởng cho mọi tác vụ liên quan đến việc quản lý các tập hợp hằng số. Nắm vững EnumSet sẽ giúp bạn viết code gọn gàng hơn, dễ đọc hơn và tối ưu hiệu suất đáng kể khi xử lý các enum trong các ứng dụng Java của mình.