【问题标题】:How do I write a generic for loop for a Java Enum?如何为 Java 枚举编写通用 for 循环?
【发布时间】:2010-02-04 22:57:30
【问题描述】:

有没有办法编写一个通用循环来迭代任意枚举? 例如:

public static void putItemsInListBox(Enum enum, ListBox listbox){
    for(Enum e : enum.values(){
        listBox.addItem(e.toString(), String.valueOf(e.ordinal());
    }
}

您不能执行上述操作,因为 Enum 类没有像已实现的 Enum 类那样名为 values() 的方法。上述 for 循环适用于定义为枚举的类。

【问题讨论】:

  • 因为你想要一组枚举而不是枚举,我建议传入 Iterable 或类似的。

标签: java for-loop enums


【解决方案1】:

它的工作方式与传递Class 完全相同:

public static <E extends Enum<?>> void iterateOverEnumsByInstance(E e)
{
    iterateOverEnumsByClass(e.getClass());
}

public static <E extends Enum<?>> void iterateOverEnumsByClass(Class<E> c)
{
    for (E o: c.getEnumConstants()) {
        System.out.println(o + " " + o.ordinal());
    }
}

用法:

enum ABC { A, B, C }
...
iterateOverEnumsByClass(ABC.class);
iterateOverEnumsByInstance(ABC.A);

【讨论】:

  • +1 谢谢,我学到了有关如何访问枚举成员的新知识!
  • 我喜欢这个答案,不过,我想稍微修改一下方法签名,签名应该是: public static > void iterateOverEnumsByInstance(E e) 和 public static > void iterateOverEnumsByClass(Class c)
【解决方案2】:

这很便宜,但应该可以工作(至少根据我的测试):

public static <T extends Enum<T>> void putItemsInListBox(Class<T> cls, ListBox listbox) {
    for (T item : EnumSet.allOf(cls))
        listbox.addItem(item.toString(), String.valueOf(item.ordinal()));
}

之所以有效,是因为EnumSetEnum 的非公共成员具有特殊的魔法访问权限,这使得它可以枚举枚举的值,尽管缺少values 方法。

【讨论】:

  • 这不是魔法。每个枚举类型T 都有一个public 静态方法T[] T.values()EnumSet 使用反射来访问它,但它不需要特殊权限。
  • @finnw:它不使用反射! (请参阅EnumSet.getUniverse 的实现。)它使用的东西非常类似于@axtavt 的答案(getEnumConstants),但以更神奇的方式(SharedSecrets.getJavaLangAccess().getEnumConstantsShared)。
  • 无论如何,axtavt 的回答比我的要好,所以我鼓励大家去投票。 :-P
猜你喜欢
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 2017-09-01
  • 2013-07-24
  • 2014-10-28
  • 1970-01-01
  • 2017-05-05
相关资源
最近更新 更多