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&gt 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&gt 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&gt 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&gt 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&gt 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à:

Tất cả các ngày trong tuần:
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 CONCERT có trong EnumSet.
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.

Câu Nói Truyền Cảm Hứng

“Bắt đầu ở đâu không quan trọng, quan trọng là bạn sẵn sàng bắt đầu.” – W. Clement Stone

Không Gian Tích Cực

“Chúc bạn luôn giữ vững niềm tin và sức mạnh để vượt qua mọi thử thách trong cuộc sống.”