2010-02-12 42 views
9

Tôi viết một thư viện dựa trên enums nhưng enum thực tế nên được xác định bởi người dùng thư viện của tôi.trừu tượng java enum

Trong ví dụ sau, phương pháp authorize yêu cầu thông số của kiểu enum Permission.

acl.authorize(userX, Permission.READ, Permission.WRITE) 

Thư viện của tôi sẽ có thể xử lý các quyền tùy ý do người dùng thư viện xác định. Nhưng tôi không thể biên dịch thư viện của mình mà không có en2 Permission. Vì vậy, tôi cần một số thứ như

abstract enum Permission 

trong thư viện của tôi. Có cách giải quyết nào để thực hiện việc này không?

Trả lời

21

tôi sẽ sử dụng một giao diện mà enum sau đó sẽ thực hiện. Nội dung nào đó dọc theo dòng

public interface PermissionType{} 

sẽ được sử dụng bằng ví dụ: khách hàng để xác định một enum như

public enum Permission implements PermissionType 
[...] 

Sau đó, API của bạn sẽ chấp nhận các thông số bằng cách sử dụng PermissionType loại

+0

Như được sử dụng trong "tính năng NIO" của JDK7. Ví dụ: http://download.java.net/jdk7/docs/api/java/nio/file/StandardCopyOption.html –

+3

@ TomHawtin-tackline: liên kết đó hiện đã chết. Long live liên kết mới: http://docs.oracle.com/javase/7/docs/api/java/nio/file/StandardCopyOption.html –

1

Dưới đây là các bước tôi đề xuất.

  1. viết chú thích - public @interface Permission
  2. khiến người dùng chú thích mỗi enums phép của mình với chú thích rằng:

    @Permission 
    public enum ConcretePermissionEnum {..} 
    
  3. Hãy phương pháp authorize bạn trông giống như:

    public boolean authorize(User user, Enum... permissions) { 
        for (Enum permission : permissions) { 
         if (permission.getClass().isAnnotationPresent(Permission.class)){ 
          // handle the permission 
         } 
        } 
    } 
    

Nếu bạn muốn enums Permission của bạn để có một số phương pháp cụ thể, hoặc chỉ muốn có một 'đánh dấu', sau đó bạn có thể làm cho sự đếm người dùng thực hiện một giao diện của bạn (thay vì được chú thích):

interface PermissionInterface {..} 
enum ConcretePermission implements PermissionInterface 

Điều này sẽ cho phép một thời gian biên dịch, chứ không phải là một tấm séc thời gian chạy, như với phương pháp chú thích, với chữ ký authorize phương pháp tìm kiếm như:

public boolean authorize(User user, PermissionInterface... permissions) 
+0

Thư viện của tôi không nên biết sự cho phép READ. Ví dụ này cho thấy cách sử dụng nơi người dùng thư viện của tôi xác định enum. Thư viện của tôi chỉ nên biết "một số yếu tố của Enum quyền". – deamon

+0

@daemon kiểm tra cập nhật của tôi – Bozho

Các vấn đề liên quan