从具有Class <! - 的整数中获取枚举?扩展枚举 - >对象

时间:2015-11-02 04:41:13

标签: java reflection enums

我看过this这是一个非常好的解决方案,如果我有一个字符串而不是整数,但是如果我拥有的是特定枚举的类对象和一个整数,我该怎么做特定的枚举常量实例?

2 个答案:

答案 0 :(得分:1)

似乎找到了答案:

((Class<? extends Enum>)clazz).getEnumConstants()[index]

虽然对于任何一个人来说,你应该考虑关注@Daniel Pryden的答案,因为在大多数使用案例中我很可能会认为这是不好的做法。

答案 1 :(得分:1)

依赖于Java枚举常量的序数值是不好的做法 - 它很容易意外地重新排序它们,这会破坏你的代码。更好的解决方案是简单地提供您可以使用的自己的整数:

public enum MyThing {
  FOO(1),
  BAR(2),
  BAZ(3);

  private final int thingId;

  private MyThing(int thingId) {
    this.thingId = thingId;
  }

  public int getThingId() {
    return thingId;
  }
}

然后,只要您想从thingId获取MyThing,只需调用getThingId()方法:

void doSomething(MyThing thing) {
  System.out.printf("Got MyThing object %s with ID %d\n",
    thing.name(), thing.getThingId());
}

如果您希望能够通过其MyThing查找thingId,则可以自行构建查找表并将其存储在static final字段中:

  private static final Map<Integer, MyThing> LOOKUP
      = createLookupMap();

  private static Map<Integer, MyThing> createLookupMap() {
    Map<Integer, MyThing> lookupMap = new HashMap<>();
    for (MyThing thing : MyThing.values()) {
      lookupMap.put(thing.getThingId(), thing);
    }
    return Collections.unmodifiableMap(lookupMap);
  }

  public static MyThing getThingById(int thingId) {
    MyThing result = LOOKUP.get(thingId);
    if (result == null) {
      throw new IllegalArgumentException(
        "This is not a valid thingId: " + thingId);
    }
    return result;
  }

如果你最终有很多枚举类,并且你想对它们各自做类似的事情,你可以为它定义一个接口:

public interface Identifiable {
  int getId();
}

然后让你的枚举实现该接口:

public enum MyThing implements Identifiable {
  ...

  @Override
  public int getId() {
    return thingId;
  }
}

然后,您可以构建一个可重用的机制,以根据其ID查找Identifiable对象。