Mục 3 của Josh Block Hiệu quả Java (Thực thi thuộc tính Singleton với một hàm tạo riêng hoặc một điều tra viên) đề cập rằng "Trong khi phương pháp này vẫn chưa được áp dụng rộng rãi, một kiểu enum phần tử đơn là cách tốt nhất để thực hiện singleton. "Singleton đơn lẻ có phải là một ý tưởng hay không?
Ví dụ:
public enum Elvis {
INSTANCE;
private final String[] favoriteSongs =
{ "Hound Dog", "Heartbreak Hotel" };
public void printFavorites() {
System.out.println(Arrays.toString(favoriteSongs));
}
}
Tiếp: "Cách tiếp cận này có chức năng tương đương với phương pháp tiếp cận lĩnh vực công cộng, ngoại trừ việc nó ngắn gọn hơn, cung cấp máy móc thiết bị serialization miễn phí, và cung cấp một đảm bảo bọc thép chống lại nhiều instantiation, ngay cả khi đối mặt với các cuộc tấn công xê-ri hóa hoặc phản chiếu tinh vi. "
Điều tiêu cực nhất mà tôi thấy là: không phải là enums không có trạng thái có thể thay đổi được? Nó có vẻ phổ biến để sử dụng một Singleton với nhà nước.
Vì vậy, mẫu này thực sự trở nên phổ biến hơn kể từ ngày xuất bản (ấn bản thứ 2 được xuất bản năm 2008)?
Tôi có phải là người duy nhất không thoải mái về cách thức enums trong Java có thể hoạt động giống như các lớp học không? Có vẻ như Java đã quyết định loại bỏ "các kiểu tìm kiếm tự nhiên" mà bạn có thể làm trong C++ bằng các phương thức nạp chồng, và biến các enum đơn giản thành đốm màu kỳ lạ này. – Uri
C++ tiếp cận enums như một phần mở rộng của việc sử dụng các int để chuyển đổi, vì vậy chúng là các cấu trúc rất đơn giản. Trong Java, mặt khác, enums được hình thành như các lớp hợp pháp, với tất cả các chức năng mà mang lại với nó, chỉ khác nhau trong một của họ (chính) hạn chế về instantiation. Họ có cùng tên bởi vì tập quán của họ chồng lên nhau trong một số lĩnh vực quan trọng, nhưng hãy thận trọng khi so sánh chúng quá chặt chẽ - chúng là những con thú rất khác nhau. – tlayton
@Uri, 'enum's trong Java không chỉ đơn thuần là hành xử giống như các lớp, chúng còn là các lớp _are_. Tất cả chúng đều mở rộng 'java.lang.Enum'. – Pops