从代码值中查找Java Enum类型?

时间:2011-02-22 02:06:52

标签: java enums

我们在数据库中使用代码值,在Java中使用Enums。查询数据库时,我们需要获取代码值并获取Enum实例。

使用HashMap避免迭代是否过度?你会怎么做?有更简单的方法吗?

public enum SomeEnum
{
    TYPE_A(2000), TYPE_B(2001);

    private int codeValue;

    private static HashMap<Integer, SomeEnum> codeValueMap = new HashMap<Integer, SomeEnum>(2);

    static
    {
        for (SomeEnum  type : SomeEnum.values())
        {
            codeValueMap.put(type.codeValue, type);
        }
    }

    //constructor and getCodeValue left out      

    public static SomeEnum getInstanceFromCodeValue(int codeValue)
    {
        return codeValueMap.get(codeValue);
    }
}

5 个答案:

答案 0 :(得分:4)

这正是我采取的解决这一特定问题的方法。从设计的角度来看,我认为它没有任何问题,它直观,高效,并且(据我所见)确实应该做到这一点。

我能想到的另一个明智的方法是将地图放在一个单独的类中,然后调用该类来从SomeEnum的构造函数更新地图。根据用例的不同,这种分离可能是有益的 - 但除非它有一个很大的好处,否则我会采用你的方法并将所有内容封装在枚举本身中。

答案 1 :(得分:1)

  

谢谢,我想我主要担心的是内存使用情况,如果值得的话。

除非enum有数千个值,否则内存使用量将是微不足道的。 (如果它确实有数千个值,那么使用迭代进行查找将是一个主要的性能杀手。)

这是对记忆的合理使用,IMO。

  

也许我在想这个。

也许你是。

答案 2 :(得分:1)

我认为在这种情况下我们无法避免迭代。它是HashMap做的,或者我们编写了自己的迭代代码。 如果性能确实很重要,也许您可​​以尝试使用二叉树方法。

答案 3 :(得分:1)

没关系。不要担心微小的性能差异。

有人会认为,如果枚举只有两个实例,就像在你的例子中一样,一个简单的迭代代码会更快:

public static SomeEnum getInstanceFromCodeValue(int codeValue)
{
    for (SomeEnum  type : SomeEnum.values()) {
        if(type.codeValue == codeValue)
            return type;
    }
}

但是如果我们在这样的水平上关心性能,那么隐藏成本是非常昂贵的。它是可以修复的,但你需要先看看它:))

答案 4 :(得分:1)

如果你的枚举空间很密集,也就是说,没有很多未使用的值,你可以使用toString()和valueOf()方法。使用公共字符串前缀命名您的值,然后在使用valueOf()之前附加前缀,并在使用toString()之后将其删除。这样做的缺点是,如果数据存储在数据库中,则必须转换为数值。

或者,您可以添加常用的转换方法,并将数据库值分配给特定的枚举值。

这两种技术都具有利用枚举类设计的优势。

http://mindprod.com/jgloss/enum.html有很多关于枚举(以及一般的Java)的好的,令人费解的信息。

但是,如果它能完成你想要的工作,你的方式没有任何问题。

相关问题