【问题标题】:Using reverse values in enums in Java [duplicate]在Java中的枚举中使用反向值[重复]
【发布时间】:2016-09-06 19:09:05
【问题描述】:

我有一个具有这样值的枚举(该示例仅显示了一些值,但您会明白的):_800、_830、_900、_24HOURS、CLOSED

这些有一个对应的值,所以我添加到我的枚举中,你可以在 Java 中这样做,一个值字段和一个 getter 和 setter 的值,像这样(为了空间,我没有显示 getter 和 setter,但是它们是标准的):

 enum Hours {
    _800("08:00"),
    _830("08:30"),
    CLOSED("Closed"),
    APPT("By Appt.")
    // etc
    ;

    Hours(String v) {
        val = v;
    }
    String val;
 }

我还希望能够走向另一个方向,也就是说,如果我有一个值(例如“08:00”),我希望它返回枚举_800。所以我在枚举中添加了一张地图:

 static Map<String,String> valToEnumMap = new HashMap();

然后我将它添加到我的构造函数中:

    Hours(String v) {
        val = v;
        valToEnumMap.put(v, this);
    }

还有一种新方法:

Hours valToEnum(String v) {
   return valToEnumMap(v);
}

但是当我尝试运行它时,我在尝试插入地图时遇到初始化错误。我已经尝试过其他的东西,比如

 valToEnumMap.put(v, valueOf(name());

但同样的错误。我确实找到了一种解决方法,但它很慢,所以我想知道我做错了什么?这是我使用的缓慢的解决方法:

public static OfficeHoursTimes valToEnum(String val) {
        for (OfficeHoursTimes o : OfficeHoursTimes.values()) {
            if (o.getVal().equals(val)) {
                  return o;
            }
        }
        return null;
}

但必须有更好的方法

【问题讨论】:

  • 枚举应该是不可变的,所以请不要设置器

标签: java constructor enums


【解决方案1】:

问题是您在初始化之前尝试使用映射,因为您的枚举实例是首先创建的。

你想像这样声明你的地图:

static final Map<String,Hours> valToEnumMap = _createValueMap();

然后

private static Map<String,Hours> _createValueMap()
{
    Map<String, Hours> map = new HashMap<>();

    //...iterate through values() and put them all in the map ...

    return map;
}

【讨论】:

  • >> 问题是你试图在初始化之前使用映射,因为你的枚举实例是首先创建的。 - 这不是真的,添加日志,你会看到它
  • @AdamSkywalker 根据我的日志,Matt 是对的。首先,创建所有枚举实例。接下来是静态字段和静态初始化程序。
  • @AdamSkywalker,你误会了。地图是枚举类中的静态字段
【解决方案2】:

乍一看,您的地图似乎定义错误。
试试

static Map<String,Hours> valToEnumMap = new HashMap<String,Hours>();

【讨论】:

  • 对不起。它是 HashMap() 而不是 HashMap()。一个错字。它可以从声明的映射中推断出参数。
猜你喜欢
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
相关资源
最近更新 更多