【问题标题】:Iterate over enums (the class objects) with shared interface in Java [closed]在Java中使用共享接口迭代枚举(类对象)[关闭]
【发布时间】:2022-01-14 15:43:33
【问题描述】:

我有几个实现接口Word 的枚举。我想生成这些枚举的所有值的列表。

我目前这样做的方式是:

    public Set<Word> allWords() {
        Set<Word> dictionary = new HashSet<>();
        dictionary.addAll(Arrays.asList(Article.values()));
        dictionary.addAll(Arrays.asList(Conjunction.values()));
        dictionary.addAll(Arrays.asList(Verb.values()));
        // And so on...
        return dictionary;
    }

有没有办法遍历这些枚举?我想这将涉及创建一个 Class 对象列表,但我不确定如何将其转换回实际值。

如果相关,Word 和每个枚举都在同一个包(词典)中。

【问题讨论】:

  • 为什么要问如何迭代?您有构建一组Word 的代码。只需循环该集合。
  • @roccobaroccoSC 该接口包含每个枚举实现的方法(getWord),该方法允许检索它所代表的字符串文字,因为其中一些包含枚举的非法字符(例如“和/要么”)。问题是我是否可以使用反射来获取每种类型的所有单词的列表。我可以简单地将所有枚举移动到一个“Word”类,并有一个属性表示它是否是特定类型,但我更愿意将逻辑组分开。
  • 您的问题和评论令人困惑。或许您应该描述一下您的总体目标。
  • 小建议:不要使用Arrays.asList(Article.values()),而是使用EnumSet.allOf(Article.class)
  • 如果你想通过字符串查找Word,只需构建一个Map&lt;String,Word&gt;。当您自己发布的代码证明您不必这样做时,不清楚为什么您声称必须“检查每个单独的枚举类”。

标签: java reflection enums


【解决方案1】:

只有当你还不知道枚举时,反射才有意义 (即您必须发现包中的枚举)。

如果你已经知道枚举, 那么您的代码的变体是合理的。

例如:

public List<Word> allWords()
{
    List<Word> returnValue = new LinkedList<>();
    returnValue.addAll(Arrays.asList(Article.values()));
    returnValue.addAll(Arrays.asList(Conjunction.values()));
    returnValue.addAll(Arrays.asList(Verb.values()));
    // And so on...
    return returnValue;
}

我建议List因为Set 会按名称删除重复项。

编辑: 我的列表建议现在似乎没有必要了。

编辑2: 根据评论, 设置并没有我想相信的那么糟糕。 仍然, 您正在将该集合用作“垃圾清单”, 我建议List 是更好的选择。

【讨论】:

  • 这很公平,我只是希望有一种更简单的方法来迭代已知的类方法。
  • A Set 通过相等而不是“按名称”拒绝重复。所有枚举常量都具有由其不同身份定义的相等性,无论其名称如何。
【解决方案2】:

您可以使用 Stream API 或纯 for-loop 遍历值

allWords()
   .stream()
   .forEach(System.out::println);
// or
Stream.of(Article.values())
       .map(Article::text) // .text is a method from your interface Word
       .forEach(System.out::println);

但老实说,您正试图对这些枚举做一些奇怪的事情。

你的任务是什么?你为什么要尝试通过枚举来解决它?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2014-06-09
    • 2014-10-28
    • 1970-01-01
    • 2014-08-11
    • 2016-04-16
    • 2021-12-18
    相关资源
    最近更新 更多