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



如果我有一个字符串而不是整数,这是一个很好的解决方案,但如果我只有特定枚举的类对象和一个整数,我如何获得特定枚举常量实例?

依赖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;
  }
}

然后,每当您想从MyThing获得thingId时,只需调用getThingId()方法:

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

如果你想通过thingId查找MyThing,你可以自己构建一个查找表,并将其存储在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();
}

然后让你的enum实现这个接口:

public enum MyThing implements Identifiable {
  ...
  @Override
  public int getId() {
    return thingId;
  }
}

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

似乎已经找到了答案:

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

尽管对于任何一个寻找它的人来说,你应该考虑遵循@Daniel Pryden的回答,因为在我能想到的大多数用例中使用它很可能是一种糟糕的做法。

相关内容

  • 没有找到相关文章

最新更新