【问题标题】:How to access a specific member in Java enum by Index value?如何通过索引值访问 Java 枚举中的特定成员?
【发布时间】:2017-11-24 14:27:14
【问题描述】:

我想打印第二个索引值,即 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!!
    }
}

如何实现?

【问题讨论】:

  • Season.SUMMER 是要走的路。或遍历 .values() 结果,然后选择第二个
  • 我其实想通过索引值来访问它。
  • Season.values()[2]...
  • so:看看 values() 返回什么,然后获取那个索引
  • 您应该避免通过索引访问Enum。它们取决于它们在代码中的顺序。如果您进行一些重构,例如 "sort project alphabetical" 或稍后将一些值添加到您的枚举而不记住您的顺序相关代码,那么您将破坏您的代码。相反,您可以设置一个Map<Integer, Season>

标签: java enums


【解决方案1】:

您的代码几乎可以正常工作。仔细看看Enum#valuesdocumentation)的方法签名。

它不是接受参数的方法,它返回整个数组。所以你需要把方法后面的访问改成array-access

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 indexToSeason = new HashMap();它不应该像 indexToSeason.put(0,Season.WINTER);等等?
  • @Zabuza 您可能应该使用new HashMap&lt;&gt;(6),因为默认初始容量是 16,您不需要那么多。默认加载因子为 0.75,因此 6 是 4 个项目的最佳值。
  • @TheKarlo95 好点,但我怀疑这样的微优化在这里会有多大帮助。在最坏的情况下,它只会让读者感到困惑。另一种选择是使用 Java 9 中非常优化的工厂方法 Map.of(...)
【解决方案2】:

如果您想在特定索引处获取枚举,请尝试:

Season.values()[index]

【讨论】:

    【解决方案3】:

    您可以通过键入所需的值来访问它们,例如 Season.WINTER、调用 Season.valueOf("WINTER") 或遍历 .values() 结果,然后按照 @Stultuske 的说明选择您想要的。

    如果在Class Enum 中搜索.values() 可能找不到,因为这个方法是编译器添加的。检查这个answer

    如果您需要通过索引值实际访问枚举,只需使用Season.values()[someIndex],因为.values() 返回一个数组T[]

    查找有关枚举here 的更多信息。

    【讨论】:

    • 复制粘贴我的评论并输入错误的名称?不错:p
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 2014-11-22
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      相关资源
      最近更新 更多