2012-04-12 17 views
3

我有一個類是打算用於未來的內部認證庫(我知道已經有這樣的現有庫)。因此,爲了使用它事情儘可能給開發者簡單許多未來的未來的項目利用這個庫我想到他們定義與角色,簡單的例子,在角色系統管理員的枚舉:如果我可以擴展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, "*")); 
} 

其他選項,正如我剛纔提到的,是定義對於枚舉的接口來實現,儘管你可以理解我們最終爲每一個新項目的實現,無論是複製和粘貼一樣簡單。

我不是在調用此方法之前轉換的東西字符串或數字來回感興趣,什麼不可以... 這個問題是有關如何規避 * 的限制與其說 *的語言,而只是同意/接受他的,否則將導致更乾淨的代碼的限制。

因此,沒有人同意這一點在這種特殊情況下,延長/包括另一個枚舉本來,這有利於這將導致更少的代碼?

詩篇。我可能是一個白癡,所以我想保留正確的電話我自己是一個白癡:)

+3

任何你沒有遵循普通的Java命名約定的理由?它使代碼更難以遵循,比它需要爲我...什麼是角色在這裏? – 2012-04-12 09:11:23

+1

如果你能*做到這一點,你的「基」枚舉有*任何*值?如果沒有,那真的覺得像是一種設計氣味...... – 2012-04-12 09:13:18

+0

角色在這裏並不相關。不,基本枚舉不會有任何值。什麼是設計氣味?你的建議是爲每個新項目實施一個界面?我希望你能向我展示一種更好的方法來實現這個功能,這樣可以方便地訪問已定義的角色,而不必求助於傳遞字符串,也不需要爲每個新項目強制實施或複製和粘貼代碼...... – momomo 2012-04-12 09:27:45

回答

5

我不明白這是如何有價值的。我不認爲繼承或延伸總是答案。如果枚舉需要更多值,請添加它們。我不同意代碼更清晰,或者這代表了語言中的嚴重限制。

+0

我認爲你不明白這一點。當我的項目中沒有定義枚舉時,如何將枚舉值添加到枚舉中,而是在庫中定義的...後面的? – momomo 2012-04-12 09:21:38

+1

是的,我明白了。我仍然認爲它不值錢。 – duffymo 2012-04-12 09:22:21

+0

好的,你能否詳細說明一下,或者給我提供一個基於上面代碼的例子,這樣一個庫可以如何設計和使用在許多項目中而不會冗餘? – momomo 2012-04-12 09:28:59

7

問問自己這個問題:爲什麼你需要這是一個枚舉?如果你的代碼沒有處理預定義的,已知的永遠不能擴展的項目集合,那麼你所擁有的並不是一個真正適合枚舉的東西,而且你可能最好使用單例對象來擴展預定義的基礎類。

如果你沒有使用枚舉的有用特性 - 內置的字符串/序數轉換的東西 - 爲什麼要使用它們呢?而且這些有用的功能在您描述的情況下無法工作,因爲它們需要生成需要知道所有枚舉值的名稱的代碼,而這些名稱現在不會發生。