我有一個類是打算用於未來的內部認證庫(我知道已經有這樣的現有庫)。因此,爲了使用它事情儘可能給開發者簡單許多未來的未來的項目利用這個庫我想到他們定義與角色,簡單的例子,在角色系統管理員的枚舉:如果我可以擴展Java枚舉,我會做X
// Not a project specific class, but Auth is intended to be part of the library
class Auth {
public static enum AUTH_ROLE {
sysadmin(new Rule(AdminController.class, "*"));
private String name;
AUTH_ROLE() {
name = this.name();
Roles.add(name);
}
AUTH_ROLE(String name) {
this.name = name;
Roles.add(name);
}
AUTH_ROLE(Rule rule) {
name = this.name();
Roles.add(name, rule);
}
AUTH_ROLE(String name, Rule rule) {
this.name = name;
Roles.add(name, rule);
}
public String getName() {
return name;
}
}
public boolean hasRole(AUTH_ROLE role) {
String[] usersRoles = getLoggedInUsersRoles();
for (String userRole : usersRoles) {
if (role.getName().equals(userRole))
return true;
}
return false;
}
}
現在,你可以看到,在枚舉AUTH_ROLE是目前 * *什麼是應該是一個非項目特定類中定義,但該驗證類應該是那就是許多項目使用的庫的一部分。
的問題是,在當前的設計,我不得不在同一個班級,驗證還定義了角色及其規則,以確定該方法hasRole(AUTH_ROLE ...)...
我想什麼做的,就是有這個枚舉所有當前的邏輯在其中定義ONCE爲所有項目,並允許在新項目的開發者能夠簡單只要定義角色和他們的規則。
我相信存在的問題是你不能在Java中擴展枚舉,所以在枚舉邏輯中的所有內容(儘管很簡單,而不是重點!)實際上必須爲每個新項目重複並可能實現和接口在圖書館提供。
如果有可能延長,那麼新的枚舉本來可以簡單地定義這些角色,那就是:
public enum AUTH_ROLE extends authlibrary.Auth.AUTH_ROLE {
sysadmin(new Rule(AdminController.class, "*"));
}
的其他選項,正如我剛纔提到的,是定義對於枚舉的接口來實現,儘管你可以理解我們最終與爲每一個新項目的實現,無論是複製和粘貼一樣簡單。
我不是在調用此方法之前轉換的東西字符串或數字來回感興趣,什麼不可以... 這個問題是有關如何規避 * 的限制與其說 *的語言,而只是同意/接受他的,否則將導致更乾淨的代碼的限制。
因此,沒有人同意這一點在這種特殊情況下,延長/包括另一個枚舉本來,這有利於這將導致更少的代碼?
詩篇。我可能是一個白癡,所以我想保留正確的電話我自己是一個白癡:)
任何你沒有遵循普通的Java命名約定的理由?它使代碼更難以遵循,比它需要爲我...什麼是角色在這裏? – 2012-04-12 09:11:23
如果你能*做到這一點,你的「基」枚舉有*任何*值?如果沒有,那真的覺得像是一種設計氣味...... – 2012-04-12 09:13:18
角色在這裏並不相關。不,基本枚舉不會有任何值。什麼是設計氣味?你的建議是爲每個新項目實施一個界面?我希望你能向我展示一種更好的方法來實現這個功能,這樣可以方便地訪問已定義的角色,而不必求助於傳遞字符串,也不需要爲每個新項目強制實施或複製和粘貼代碼...... – momomo 2012-04-12 09:27:45