拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 用Java 中的所有枚举值填充列表

用Java 中的所有枚举值填充列表

白鹭 - 2022-11-29 2260 0 2

一、概述

Java 在1.5 版本中引入了enum将常量定义为enum使代码更具可读性。此外,它允许编译时检查。

在本快速教程中,让我们探讨如何获取包含enum类型的所有实例的List

二、问题介绍

像往常一样,我们将通过一个例子来理解这个问题。

首先,让我们创建一个enum类型MagicNumber

enum MagicNumber {
 ONE, TWO, THREE, FOUR, FIVE
 }

然后,我们的目标是获得一个包含MagicNumber enum的所有实例的List

List<MagicNumber> EXPECTED_LIST = Arrays.asList(ONE, TWO, THREE, FOUR, FIVE);

在这里,我们使用Arrays.asList()方法从数组初始化列表。

稍后,我们将探索几种不同的方法来获得预期的结果。最后,为简单起见,我们将使用单元测试断言来验证每个方法是否给出了预期的结果。

那么接下来,让我们看看他们的行动。

3. 使用EnumType.values()方法

当我们准备EXPECTED_LIST,我们从一个数组中初始化它。因此,如果我们可以从数组中的enum中获取所有实例,我们就可以构建列表并解决问题。

每个enum类型都提供标准的values()方法来返回数组中的所有实例那么接下来,让我们从MagicNumber.values()建立一个列表:

List<MagicNumber> result = Arrays.asList(MagicNumber.values());
 assertEquals(EXPECTED_LIST, result);

如果我们运行测试,它就会通过。所以,我们得到了预期的列表。

4. 使用EnumType.class.getEnumConstants()方法

我们已经看到使用enum类型的values()来获取数组中的所有enum实例。这是一种标准且直接的方法。但是,我们需要确切地知道enum类型的名称并将其硬编码在代码中,例如MagicNumber.values()换句话说,通过这种方式,我们无法构建适用于所有enum类型的实用方法。

从Java 1.5 开始,Class对象提供了getEnumConstants()方法来从enum Class对像中获取所有enum实例因此,我们可以让getEnumConstants()提供enum实例:

List<MagicNumber> result = Arrays.asList(MagicNumber.class.getEnumConstants());
 assertEquals(EXPECTED_LIST, result);

如上面的测试所示,我们使用MagicNumber.class.getEnumConstants()来提供enum实例数组。此外,很容易构建适用于所有enum类型的实用方法:

static <T> List<T> enumValuesInList(Class<T> enumCls) {
 T[] arr = enumCls.getEnumConstants();
 return arr == null ? Collections.emptyList() : Arrays.asList(arr);
 }

值得一提的是,如果Class对像不是enum类型,则getEnumConstants()方法返回null如我们所见,在这种情况下我们返回一个空List

接下来,让我们创建一个测试来验证enumValuesInList()

List<MagicNumber> result1 = enumValuesInList(MagicNumber.class);
 assertEquals(EXPECTED_LIST, result1);
 List<Integer> result2 = enumValuesInList(Integer.class);
 assertTrue(result2.isEmpty());

如果我们试一试,测试就会通过。如我们所见,如果类对像不在enum类型中,我们就有一个空列表

5. 使用EnumSet.allOf()方法

从1.5 版开始,Java 引入了一个特定的Set来处理enum类:EnumSet此外,EnumSet具有allOf()方法来加载给定enum类型的所有实例

因此,我们可以使用ArrayList()构造函数和填充的EnumSet来构造一个List对象。那么接下来,我们通过一个测试来看看它是如何工作的:

List<MagicNumber> result = new ArrayList<>(EnumSet.allOf(MagicNumber.class));
 assertEquals(EXPECTED_LIST, result);

值得一提的是,调用allOf()方法以自然顺序存储enum的实例。

六,结论

在本文中,我们学习了三种获取包含enum.所有实例的List对象的方法。


标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *