2012-12-22 65 views
0

我真的很喜歡編碼時讀取枚舉的方便。 最近我遇到了一個任務,我需要接受一個關鍵字列表,每個都會執行一個操作。Enum需要設計指導

例關鍵字:早餐,午餐,晚餐

所以我想能寫這樣的事: String whatImGoingToMake = Keywords.BREAKFAST("banana").getPopularRecipe(); 這裏的想法是用香蕉作爲原料,以獲得受歡迎的早餐食譜。 我想到了這個,因爲我想到了使用反射它應該能夠工作。

問題是我無法調用getPopularRecipe(),因爲它不是靜態的,不允許用於內部類。

我是否正確,強迫枚舉類似這樣做並使用類來代替它?接下來的編碼器最簡單的實現是什麼,然後選擇它來理解?

也許是因爲它在這裏遲到了,但我在這一點上掙扎着。

我試圖遠離長長的IF語句或switch語句,如果可能的話。我只是不喜歡看到他們,不惜一切代價避免他們。所以,我不想寫類似:



    if (param.equals("BREAKFAST") { 
     //lookup in breakfast db 
    } else if (param.equals("LUNCH") { 
     //you get the idea - I dont like this since it can go on forever if we start adding BRUNCH, SUPPER, SNACK 
    } 

這裏是枚舉,即時通訊感興趣的是得到工作:



    public enum MyUtil { 
     BREAKFAST { 
      public String getPopularRecipe(String ingredient) { 
       //do something with ingredient 
       return recipe; 
      } 
     }, 
     LUNCH { 
      public String getPopularRecipe(String ingredient) { 
       //do something with ingredient 
       return recipe; 
      } 
     } 
    } 

+0

有時它們(if語句)是正確的選擇,使用它們。 (KISS!) – Swapnil

+0

那麼你最後一個例子有什麼問題?它完全允許你想要做的事情。 – tcb

+0

也許是由於我的C#背景,這看起來不像'enum'。 ('關鍵字.BREAKFAST(「香蕉」)'我怎麼看它是一個函數調用) –

回答

3

如果我正確理解你的問題,你需要有一個abstract Enum中的方法getPopularRecipe(),並且應覆蓋所有枚舉實例。

例子:

public enum MyUtil { 
     BREAKFAST { 
      @Override 
      public String getPopularRecipe(String ingredient) { 
       //do something with ingredient 
       return recipe; 
      } 
     }, 
     LUNCH { 
       @Override  
      public String getPopularRecipe(String ingredient) { 
       //do something with ingredient 
       return recipe; 
      } 
     } 
     public abstract String getPopularRecipe(String ingredient); 
    } 

請參閱本tutorial更多信息(閱讀,直到結束)。

0

您是在複雜的事情:

public enum Meal { 
    BREAKFAST("Bacon and eggs"), 
    LUNCH("Salad"), 
    DINNER("Steak and veg"); 
    private final String ingredient; 
    Meal(String ingredient) { 
     // do whatever you like here 
     this.ingredient = ingredient; 
    } 
    public String getPopularRecipe() { 
     return ingredient; 
    } 
} 

構造函數,字段和方法可以像那些普通類一樣複雜。枚舉比許多人意識到的更類似於普通類。它們甚至不是不變的(學生們注意到:雖然引用是最終的,但是實例像任何類一樣可變 - 例如枚舉可能有setter方法等)