2014-03-12 41 views
1

我有一種情況,我定義組織的安全角色。這些選擇是一組已知的枚舉默認值,以及任意數量的自定義角色的可能性。角色定義員工在組織中的權限。例如,用戶可以;類和枚舉功能的混合

public enum Role 
{ 
    Owner, Administrator, User, Guest; 
} 

但是,組織也可能希望自己的自定義角色(例如PowerUser)。我正在尋找最好的方法來聲明一個具有已知枚舉值列表(這是枚舉)的對象,但可以提供任意數量的自定義值(即一個類)。

天真的方法將是以下(添加自定義枚舉值):

public enum Role 
{ 
    Owner, Administrator, User, Guest, Custom; 

    public BaseRole asRole() 
    { 
     //switch statement returning the BaseRole depending on the enum value. 
    } 
} 

public class BaseRole 
{ 
    Set<Permission> permissions; 
} 

此選項的問題是,如果選擇了枚舉值定製的膠水代碼會變得非常冗長。由於包含所有可能的自定義角色的自定義值的行爲與其他值不同,因此接受角色的每個函數都需要特殊的粘合來處理自定義。

理想的情況下,這樣的事情很可能是最好的:

public enum Role 
{ 
    Owner, Administrator, User, Guest, Set<Custom>; 

} 

編輯:

參考,用戶類是

public class User 
{ 
    Set<Role> roles; 
} 
+0

怎麼樣有'用戶'列''變量? – libik

+0

@libik,我想要選擇默認角色的一些類型安全,並且能夠在運行時定義其他角色。用戶確實有一個列表變量。 –

+0

@libik更好'設置' – polypiel

回答

0

這是我一起去的解決方案。

public interface Role 
{ 
    String getName(); 
} 

public enum StandardRole implements Role 
{ 
    Owner, Administrator, User, Guest; 

    @Override 
    public String getName() 
    { 
     return this.name(); 
    } 
} 

public class CustomRole implements Role 
{ 
    private String name; 

    public CustomRole(String name) 
    { 
     this.name = name; 
    } 

    @Override 
    public String getName() 
    { 
     return this.name; 
    } 
} 

public class User 
{ 
    Set<Role> roles; 
} 
2

一個可能的解決辦法是回頭僞枚舉實現在預enum的Java版本。例如:

public class Role { 

    public static final Role OWNER = new Role("OWNER"); 
    public static final Role ADMIN = new Role("ADMIN"); 
    public static final Role USER = new Role("USER"); 
    public static final Role GUEST = new Role("GUEST"); 

    private String name; 

    // getter, setter, constructor, toString(), hashCode(), equals() 
} 

所以每當需要Role,您可以使用最終字段:

Role r = Role.OWNER; 

而且還是定義自定義的:

Role r = new Role("Cook"); 

對於一些謹慎,它甚至可能允許==在變量和預定義值之間進行相等性檢查,但我會建議不要這樣做(始終使用equals())。