2014-02-07 3 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 (1 л), и сравнить их с этим перечисление с использованием

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

Я действительно ненавижу эти жестко закодированные константы во всем моем коде так Мне было интересно, если это плохая практика, чтобы использовать что-то вроде этого, вместо:

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

или

someLongThatIPassAsParameter = eMyEnum.FIRST.getId(); 

Это всего лишь несколько простых примеров, но в основном это та же самая проблема повторяется снова и снова. Как вы думаете?

+1

Я не понимаю, почему 'isAnalog()' и 'isUsb()' методы ... почему они проверяют на '' SECOND' и THIRD'? Или, может быть, это просто произвольно ... Надеюсь, это не так, как в вашей программе. –

+0

Почему вы не создаете методы, которые принимают типы перечисления и возвращают все, что хотите? – Omoro

+0

Спасибо, Яник! Это потому, что я изменил перечисление для простоты в качестве примера, эти методы были из исходного кода, оставленные там непреднамеренно. Я отредактировал его и исправил. –

ответ

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

Почему бы не реализовать метод FromLong в перечислении

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

, а затем преобразовать лонги в перечислении и сравнить перечислений. Таким образом, вы бы:

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 way также хорош, но я использую его в случае, когда удобнее использовать значения перечисления в параметрах, а значение в перечислении - это дополнительная информация (например, 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

Спасибо! Я использовал что-то похожее на это –

Смежные вопросы