2014-02-07 27 views
1

我正在尋找方法來實現和訪問我的枚舉,並且我對代碼的外觀不是很滿意。這似乎是一種修補方式。因此,這裏是我想要做的事:以乾淨的方式使用<key, value>枚舉

考慮這個簡單枚舉作爲什麼,我試圖做一個例子:

public enum MyEnum { 

    FIRST(0L), SECOND(1L), THIRD(2L); 
    private Long number; 

    private MyEnum(Long number){ 
    this.number= id; 
    } 

    public static boolean isFirst(MyEnum type) { 
    return type == FIRST; 
    } 

    public static boolean isSecond(MyEnum type) { 
    return type == SECOND; 
    } 

    public static boolean isThird(MyEnum type) { 
    return type == THIRD; 
    } 

    public Long getId() { 
    return number; 
    } 

}

後來,我有一些對象我設置爲Long.valueOf(1L),並使用此枚舉比較

Long.valueOf(1L).equals(instanceOfMyEnum.getId())

我真的很討厭有遍佈我的代碼,這些硬編碼的常數這樣我在想,如果這是一個壞的做法是使用這樣的事情,而不是:

eMyEnum.FIRST.getId().equals(instanceOfMyEnum.getId()) 

someLongThatIPassAsParameter = eMyEnum.FIRST.getId(); 

這些只是一些簡單的例子,但基本上它是一遍又一遍地重複同樣的問題。你怎麼看?

+1

我不明白爲什麼'isAnalog()'和'isUsb()'方法......他們爲什麼要檢查'SECOND'和'THIRD'?或者,也許這只是任意的......我希望在你的程序中不是這樣。 –

+0

爲什麼不創建方法來接受枚舉類型並返回任何你想要的? – Omoro

+0

謝謝Yanick!這是因爲我爲了簡單而改變了枚舉類型,這些方法來自原始代碼,無意中留在那裏。我編輯它並立即修復。 –

回答

3

如果你有大量的枚舉值,我會做這樣的事情(沒有必要,如果你添加新的修改代碼):

public enum MyEnum { 
    FIRST(0L), SECOND(1L), THIRD(2L); 

    private Long number; 

    /** 
    * Lookup map, to provide a quick way to access your enums by id 
    */ 
    private static final Map<Long, MyEnum> LOOKUP = new HashMap<Long, MyEnum>(); 

    /** 
    * Static initializer, which loads your enums values runtime, and maps them 
    * to their 'number' member. 
    */ 
    static { 
     MyEnum[] enums = MyEnum.class.getEnumConstants(); 
     for(MyEnum en : enums){ 
      LOOKUP.put(en.number, en); 
     } 
    } 

    private MyEnum(final Long number) { 
     this.number = number; 
    } 

    /** 
    * Gets the enum value associated with the parameter, id. 
    * @param id The id, that identifies your enum value 
    * @return The enum value, or null, if not found. 
    */ 
    public static MyEnum getById(final Long id){ 
     return LOOKUP.get(id); 
    } 
} 
+0

我喜歡這個解決方案!非常適合我的問題,尤其是因爲我最終會在該枚舉中添加更多值。謝謝! –

+0

我很高興你喜歡它:) –

1

爲什麼不能在枚舉

public static MyEnum fromLong(long l) { 
    switch (l) { 
    { 
     case 0: return FIRST; 
     case 1: return SECOND; 
     case 2: return THIRD; 
    } 
    throw new IllegalArgumentException(); 
} 

實施fromLong方法,然後轉換渴望枚舉和比較枚舉。所以,你會:

MyEnum.fromLong(longValue) == MyEnum.FIRST 
0

顯然,雖然您創建一個枚舉,您還在使用這些長期價值無處不在,所以也許你可以使用類似:

public class TypeOfSomething { 
    public static final long FIRST = 1l; 
    public static final long ANALOG = 2l; 
    public static final long USB = 3l; 
} 

,然後使用他們喜歡的:

someLongThatIPassAsParameter = TypeOfSomething.ANALOG; 

枚舉的方式也很好,但我使用它的情況下,在參數中使用enum值更加舒適,enum中的值只是附加信息(例如, messages.properties鍵國際化)

2

林不知道我是否正確理解你的問題,但使用開關檢查這個檢查呢?

public enum MyEnum { 

       FIRST(0L), SECOND(1L), THIRD(2L); 
       private Long number; 

       private static Map<Long, MyEnum> byIds = new HashMap<Long, PlaceServiceV2.MyEnum>(); 
       static{ 
        for(MyEnum myEnum :MyEnum.values()){ 
         byIds.put(myEnum.number, myEnum); 
        } 

       } 

       private MyEnum(Long number){ 
       this.number = number; 
       } 

       public static MyEnum getById(Long id) { 
       return byIds.get(id); 
       } 

       public Long getId() { 
       return number; 
     } 
     } 

public void test(){ 
    switch (MyEnum.getById(1L)) { 
    case FIRST: 

     break; 
    case SECOND: 

     break; 

    default: 
     break; 
    } 
} 
+0

謝謝!我用了類似的東西 –