如何通过索引值访问Java枚举中的特定成员?

4

我想打印第二个索引值,即SUMMER。

public class Filer
{
    public enum Season { WINTER, SPRING, SUMMER, FALL }

    public static void main(String[] args)
    {
        System.out.println(Season.values(2));//values don't take argument!!
    }
}

如何实现这个目标?

3
季节选择夏季。或者遍历.values()结果,并选择第二个。 - Stultuske
我实际上想通过索引值访问它。 - Suvam Roy
2
Season.values()[2]... - Mark Rotteveel
所以,看一下values()返回的值,并对该索引进行get操作。 - Stultuske
2
你应该避免通过索引访问Enum。它们依赖于代码中的顺序。如果您进行一些重构,例如“按字母顺序排序项目”,或稍后添加一些值到枚举中而不记得您的顺序相关代码,则会破坏您的代码。相反,您可以设置一个Map<Integer, Season> - Zabuzard
4个回答

9
你的代码基本上可以运行。请仔细看一下Enum#values方法的签名(文档)。
这个方法没有接受参数的方法,它返回整个数组。因此,在方法之后需要移动访问到数组访问
Season.values()[2]

您应该避免通过索引访问Enum。它们依赖于代码中的顺序。如果您进行一些重构,比如"按字母顺序排序项目"

public enum Season {
    FALL,    // 3 -> 0
    SPRING,  // 1 -> 1
    SUMMER,  // 2 -> 2
    WINTER   // 0 -> 3
}

如果您想在枚举中添加一些值,而不必记住它们的顺序,那么您可能会破坏您的代码。相反,您可以设置一个Map<Integer, Season>

Map<Integer, Season> indexToSeason = new HashMap<>();
indexToSeason.put(0, Season.WINTER);
indexToSeason.put(1, Season.SPRING);
indexToSeason.put(2, Season.SUMMER);
indexToSeason.put(3, Season.FALL);

然后使用该地图进行访问:

public Season getSeasonByIndex(int index) {
    return indexToSeason.get(index);
}

这真的很有用。但是,由于您声明了Map<Integer,Season> indexToSeason = new HashMap<>(); ,难道不应该像indexToSeason.put(0,Season.WINTER)等一样吗? - Suvam Roy
@Zabuza 你应该使用new HashMap<>(6),因为默认初始容量为16,你不需要那么多。默认的负载因子是0.75,所以6是4个元素的最佳选择。 - TheKarlo95
@TheKarlo95 不错的观点,但我怀疑这种微观优化对此并没有太大帮助。最坏的情况下,它只会让读者感到困惑。另一个选择是使用非常优化的工厂方法 Map.of(...),它来自于 Java 9 - Zabuzard

6
如果你想获取特定索引处的枚举值,请尝试以下方法:
Season.values()[index]

4
您可以通过输入您想要的值,例如 Season.WINTER、调用 Season.valueOf("WINTER") 或迭代 .values() 的结果并选择所需的内容(如 @Stultuske 所述)来访问它们。
如果您在 Enum 类 中搜索 .values(),可能找不到它,因为该方法是由编译器添加的。请参见这个答案
如果您需要通过索引值实际访问 Enum,请使用 Season.values()[someIndex],因为 .values() 返回一个数组 T[]
在此处查找有关 Enums 的更多信息

1
把我的评论复制粘贴,还把名字搞错了?不错啊 :p - Stultuske

2

System.out.println(Season.values()[2]);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接