2014-02-07 22 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

谢谢!我用了类似的东西 –