[当只能使用有限数量的值的变量/参数时,我尝试始终使用Java的enum
,如
public enum BonusType {
MONTHLY, YEARLY, ONE_OFF
}
只要我留在代码中,就可以正常工作。但是,出于相同的目的,我经常需要与使用普通int
(或String
)值的其他代码进行交互,或者我需要从数据库中读取/写入数据,在该数据库中数据以数字或字符串的形式存储。
在那种情况下,我想有一种方便的方法将每个枚举值与一个整数相关联,这样我就可以同时转换两种方式(换句话说,我需要一个“可逆枚举”。)]
从枚举到整数很容易:
public enum BonusType { public final int id; BonusType(int id) { this.id = id; } MONTHLY(1), YEARLY(2), ONE_OFF(3); }
然后我可以将int值作为
BonusType x = MONTHLY; int id = x.id;
进行访问。
但是,我看不到任何相反的好方法,即从int到枚举。理想情况下,类似
BonusType bt = BonusType.getById(2);
我唯一能想到的解决方案是:
BonusType.values()
填充映射“ int->枚举”,然后对其进行缓存并将其用于查找。可以,但是我必须将此方法完全复制到我使用的每个枚举中:-(。这两种方法对于这样一个简单的(?)问题都显得很尴尬。
还有其他想法/见解吗?
[当只能使用有限数量的值的变量/参数时,我尝试始终使用Java的枚举,就像在公共枚举中一样BonusType {MONTHLY,YEARLY,ONE_OFF}只要我停留...
一个非常干净的反向枚举用法示例
我不确定Java中是否相同,但是C中的枚举类型也会自动映射为整数,因此您可以使用类型或整数来访问它。您是否尝试过仅使用整数访问它?
真的是个好问题:-)我前一段时间使用了类似于弗格森先生的解决方案。我们反编译的枚举看起来像这样:
为了完整起见,这是一种从任何枚举类型按索引检索枚举值的通用方法。我的意图是使该方法看起来和感觉像Enum.valueOf(Class, String)。仅供参考,我从here复制了此方法。
Int -->String :
public enum Country {
US("US",0),
UK("UK",2),
DE("DE",1);
private static Map<Integer, String> domainToCountryMapping;
private String country;
private int domain;
private Country(String country,int domain){
this.country=country.toUpperCase();
this.domain=domain;
}
public String getCountry(){
return country;
}
public static String getCountry(String domain) {
if (domainToCountryMapping == null) {
initMapping();
}
if(domainToCountryMapping.get(domain)!=null){
return domainToCountryMapping.get(domain);
}else{
return "US";
}
}
private static void initMapping() {
domainToCountryMapping = new HashMap<Integer, String>();
for (Country s : values()) {
domainToCountryMapping.put(s.domain, s.country);
}
}
我需要一些不同的东西,因为我想使用通用方法。我正在从字节数组读取枚举。这是我想出的地方:
仅因为接受的答案不包含在内:
给定:
如果您有课程汽车
我在网上发现了这一点,它非常有用且易于实现。这个解决方案不是我做的
似乎此问题的答案在Java 8发行中已经过时。
您也许可以使用类似的东西
在此代码中,要进行永久性的密集搜索,请使用内存或进程,然后选择内存,并以转换器数组作为索引。希望对您有所帮助
使用界面显示谁是老板。
.ordinal()
和values()[i]
都是不稳定的,因为它们都依赖于枚举的顺序。因此,如果您更改枚举的顺序或添加/删除某些枚举,则程序将中断。