使用 Java 中的共享接口迭代枚举(class 对象)
Iterate over enums (the class objects) with shared interface in Java
我有几个实现接口 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 和每个枚举都在同一个包(词典)中。
仅当您还不知道枚举时,反思才有意义
(即您必须发现包中的枚举)。
如果您已经知道枚举,
那么您的代码的变体是合理的。
例如:
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
是更好的选择。
您可以使用 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);
但老实说,您正试图用这些枚举做一些奇怪的事情。
你的任务是什么?为什么您要尝试通过枚举来解决它?
我有几个实现接口 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 和每个枚举都在同一个包(词典)中。
仅当您还不知道枚举时,反思才有意义 (即您必须发现包中的枚举)。
如果您已经知道枚举, 那么您的代码的变体是合理的。
例如:
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
是更好的选择。
您可以使用 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);
但老实说,您正试图用这些枚举做一些奇怪的事情。
你的任务是什么?为什么您要尝试通过枚举来解决它?