2010-02-12 100 views
9

我寫一個庫應依賴枚舉,但實際的枚舉應該由我的庫的用戶定義。抽象Java枚舉

在以下示例中,authorize方法需要枚舉類型Permission的參數。

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

我的庫應該能夠處理庫用戶定義的任意權限。但是如果沒有Permission枚舉,我無法編譯我的庫。所以我需要像

abstract enum Permission 

在我的書架。有沒有解決方法來做到這一點?

回答

21

我會用一個接口,枚舉會然後實現。沿着線

public interface PermissionType{} 

它將被例如,客戶端定義枚舉如

public enum Permission implements PermissionType 
[...] 

那麼你的API將接受使用PermissionType

+0

用於JDK7的「更多NIO功能」。例如:http://download.java.net/jdk7/docs/api/java/nio/file/StandardCopyOption.html – 2010-02-12 13:37:00

+3

@ TomHawtin-tackline:該鏈接現已停止。萬歲新鏈接:http://docs.oracle.com/javase/7/docs/api/java/nio/file/StandardCopyOption.html – 2012-07-30 23:22:17

1

下面是我建議的步驟。

  1. 寫的註釋 - public @interface Permission
  2. 讓用戶標註每一個他與註釋權限枚舉:

    @Permission 
    public enum ConcretePermissionEnum {..} 
    
  3. 讓你authorize方法是這樣的:

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

如果你希望你的權限枚舉有一些具體的方法,或者只是想有一個「標記」,然後就可以使用戶枚舉實現你的接口(而不是被註釋):

interface PermissionInterface {..} 
enum ConcretePermission implements PermissionInterface 

這將使編譯時間,而不是運行時檢查,與註釋的方法,用authorize方法簽名看起來像:

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

我的圖書館不應該知道的讀取權限參數。該示例顯示了我的庫的用戶定義枚舉的用法。我的圖書館應該只知道「權限枚舉的某些元素」。 – deamon 2010-02-12 11:20:48

+0

@daemon檢查我的更新 – Bozho 2010-02-12 11:26:15