方便地在enum和int / String之间映射

问题描述 投票:107回答:18

[当只能使用有限数量的值的变量/参数时,我尝试始终使用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 enums coding-style
18个回答

2
投票

一个非常干净的反向枚举用法示例


1
投票

我不确定Java中是否相同,但是C中的枚举类型也会自动映射为整数,因此您可以使用类型或整数来访问它。您是否尝试过仅使用整数访问它?


1
投票

真的是个好问题:-)我前一段时间使用了类似于弗格森先生的解决方案。我们反编译的枚举看起来像这样:


1
投票

为了完整起见,这是一种从任何枚举类型按索引检索枚举值的通用方法。我的意图是使该方法看起来和感觉像Enum.valueOf(Class, String)。仅供参考,我从here复制了此方法。


0
投票
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);
            }
        }

0
投票

我需要一些不同的东西,因为我想使用通用方法。我正在从字节数组读取枚举。这是我想出的地方:


0
投票

仅因为接受的答案不包含在内:


0
投票

给定:


0
投票

如果您有课程汽车


324
投票

枚举→整数


27
投票

我在网上发现了这一点,它非常有用且易于实现。这个解决方案不是我做的


7
投票

似乎此问题的答案在Java 8发行中已经过时。


5
投票

org.apache.commons.lang.enums.ValuedEnum;


3
投票

您也许可以使用类似的东西


3
投票

在此代码中,要进行永久性的密集搜索,请使用内存或进程,然后选择内存,并以转换器数组作为索引。希望对您有所帮助


2
投票

使用界面显示谁是老板。


2
投票

.ordinal()values()[i]都是不稳定的,因为它们都依赖于枚举的顺序。因此,如果您更改枚举的顺序或添加/删除某些枚举,则程序将中断。

© www.soinside.com 2019 - 2024. All rights reserved.