2010-07-04 12 views
6

Tôi đang sử dụng một mô hình enum singletom như thế này:Hãy một thể hiện enum tin

public enum LicenseLoader implements ClientLicense { 
    INSTANCE; 

    /** 
    * @return an instance of ClientLicense 
    */ 
    public static ClientLicense getInstance() { 
     return (ClientLicense)INSTANCE; 
    } 

    ...rest of code 

} 

Bây giờ tôi muốn quay trở lại giao diện và giấu một thực tế mà chúng tôi đang thực sự sử dụng một enum ở tất cả. Tôi muốn khách hàng sử dụng getInstance() và không phải LicenseLoader.INSTANCE là một ngày tôi có thể quyết định sử dụng một mẫu khác nếu cần.

Có thể đặt INSTANCE ở chế độ riêng tư không?

Trả lời

4

Điều gì về việc tạo ra một public interfaceprivate enum rằng implements giao diện đã nói, với một hằng số INSTANCE đơn lẻ?

Vì vậy, một cái gì đó như thế này (tất cả trong một lớp học cho ngắn gọn):

public class PrivateEnum { 

    public interface Worker { 
     void doSomething(); 
    } 

    static private enum Elvis implements Worker { 
     INSTANCE; 
     @Override public void doSomething() { 
      System.out.println("Thank you! Thank you very much!"); 
     } 
    } 

    public Worker getWorker() { 
     return Elvis.INSTANCE; 
    } 
} 

Bằng cách này, bạn không để lộ Elvis.INSTANCE (hoặc thậm chí enum Elvis tại tất cả), sử dụng một interface để xác định chức năng của mình, ẩn tất cả chi tiết triển khai.

+0

Cảm ơn ý tưởng tốt. – jax

+1

Điều này làm việc hoàn hảo, nó cho phép tôi để làm cho gói công nhân tư nhân cũng cho phép tôi để có được một số thứ tôi muốn giữ riêng tư với thế giới bên ngoài nhưng có sẵn trong bối cảnh gói. – jax

+0

Ví dụ 'enum' vẫn có sẵn, như tôi đã giải thích. –

1

Tất cả các hằng số enum đều có thể truy cập được. Ví dụ thông qua deserialisation hoặc enum phương pháp phản xạ đặc biệt.

Như thường lệ, tôi khuyên bạn nên tránh những người độc thân.

+1

Bạn đang đưa ra lời khuyên xấu. "Mẫu enum singleton cung cấp một bảo đảm chắc chắn chống lại nhiều sự khởi tạo, ngay cả khi đối mặt với các cuộc tấn công tuần tự hóa hoặc phản chiếu tinh vi." (Hiệu quả Java - Joshua Bloch) – jax

+1

Không, tôi không đưa ra lời khuyên xấu cho bạn. –

+0

@Tom: ý của bạn là "vẫn có sẵn" (bình luận cho câu trả lời của tôi)? 'private' khả năng truy cập sửa đổi trên' enum' không phải là ironclad (ví dụ như 'setAccessible' tấn công), nhưng điều này là đúng của mỗi' lớp', không chỉ 'enum'. – polygenelubricants