Như đã, trong một chừng mực nào đó, đã được đề cập trước đó, enum là một lớp java với điều kiện đặc biệt là định nghĩa của nó phải bắt đầu bằng ít nhất một "hằng số enum".
Ngoài ra, và enums không thể được mở rộng hoặc sử dụng để mở rộng các lớp khác, enum là một lớp giống như bất kỳ lớp nào và bạn sử dụng nó bằng cách thêm các phương thức bên dưới các định nghĩa không đổi:
public enum MySingleton {
INSTANCE;
public void doSomething() { ... }
public synchronized String getSomething() { return something; }
private String something;
}
Bạn truy cập các phương thức của singleton dọc theo các dòng này:
MySingleton.INSTANCE.doSomething();
String something = MySingleton.INSTANCE.getSomething();
Việc sử dụng một enum, thay vì một lớp, như đã được đề cập trong các câu trả lời khác, chủ yếu là về việc khởi tạo an toàn luồng của đơn và đảm bảo rằng nó sẽ luôn chỉ là một bản sao.
Và, có lẽ, quan trọng nhất là hành vi này được đảm bảo bởi chính JVM và đặc tả Java.
Đây là một phần từ đặc tả Java về cách ngăn chặn nhiều phiên bản của một cá thể enum:
Một loại enum không có trường hợp nào khác ngoài các trường hợp được xác định bởi hằng số enum của nó. Đó là một lỗi thời gian biên dịch để cố gắng khởi tạo một cách rõ ràng một kiểu enum. Phương pháp nhân bản cuối cùng trong Enum đảm bảo rằng các hằng số enum không bao giờ có thể được sao chép và việc xử lý đặc biệt bằng cơ chế tuần tự hóa đảm bảo rằng các trường hợp trùng lặp không bao giờ được tạo ra do quá trình khử lưu huỳnh. Phản xạ tức thời của các loại enum bị cấm. Cùng với nhau, bốn điều này đảm bảo rằng không có trường hợp nào của loại enum tồn tại ngoài những trường hợp được xác định bởi hằng số enum.
Đáng lưu ý là sau khi khởi tạo, mọi vấn đề về an toàn luồng phải được xử lý như trong bất kỳ lớp nào khác với từ khóa được đồng bộ hóa, v.v.