我们在数据库中使用代码值,在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);
}
}
答案 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)的好的,令人费解的信息。
但是,如果它能完成你想要的工作,你的方式没有任何问题。