【发布时间】:2011-06-28 14:52:42
【问题描述】:
当使用只能取有限数量值的变量/参数时,我尝试始终使用 Java 的 enum,如
public enum BonusType {
MONTHLY, YEARLY, ONE_OFF
}
只要我留在我的代码中,就可以正常工作。但是,我经常需要与其他使用纯int(或String)值的代码进行交互以达到相同目的,或者我需要读取/写入数据存储为数字或字符串的数据库.
在这种情况下,我希望有一种方便的方法将每个枚举值与一个整数相关联,这样我就可以两种方式进行转换(换句话说,我需要一个“可逆枚举”)。
从 enum 到 int 很容易:
public enum BonusType {
public final int id;
BonusType(int id) {
this.id = id;
}
MONTHLY(1), YEARLY(2), ONE_OFF(3);
}
然后我可以以BonusType x = MONTHLY; int id = x.id; 访问int 值。
但是,我看不出相反的好方法,即从 int 到 enum。理想情况下,像
BonusType bt = BonusType.getById(2);
我能想到的唯一解决方案是:
- 将查找方法放入枚举中,该方法使用
BonusType.values()填充映射“int -> enum”,然后将其缓存并用于查找。可以,但我必须将此方法完全相同地复制到我使用的每个枚举中:-(。 - 将查找方法放入静态实用程序类中。然后我只需要一个“查找”方法,但我必须摆弄反射以使其适用于任意枚举。
对于这样一个简单的 (?) 问题,这两种方法似乎都非常尴尬。
还有其他想法/见解吗?
【问题讨论】:
-
我
-
对于 enum->int 你可以使用
ordinal() -
你的 id 值是由你决定的(意思是,你不能只使用
.ordinal()),还是由外部力量决定? -
@davin:是的,当有人重新排列枚举声明或删除中间的值时,让您的代码中断。恐怕这不是一个强大的解决方案:-/。
-
@davin 应尽可能避免使用“ordinal()”,它在语言规范中
标签: java enums coding-style