Java 使用 enum with switch 语句

2022-08-31 08:49:29

我已经看过与这个问题类似的SO的各种问答,但还没有找到解决方案。

我拥有的是一个枚举,它代表了查看电视指南的不同方式......

在 NDroid 类中Application

static enum guideView {
    GUIDE_VIEW_SEVEN_DAY,
    GUIDE_VIEW_NOW_SHOWING,
    GUIDE_VIEW_ALL_TIMESLOTS
}

...当用户更改视图时,事件处理程序收到一个从0-2开始,我想做这样的事情...int

在安卓事件处理程序中ActivityonClick(DialogInterface dialog, int which)

// 'which' is an int from 0-2
switch (which) {
    case NDroid.guideView.GUIDE_VIEW_SEVEN_DAY:
    ...
    break;
}

我习惯于C#枚举和select/case语句,这将允许像上面这样的东西,我知道Java做事的方式不同,但我只是无法理解我需要做什么。

我是否必须诉诸声明?可能只有3个选择,所以我可以做到这一点,但我想知道如何在Java中使用switch-case来完成它。if

编辑对不起,我没有完全扩展这个问题,因为我把它看作是一个通用的Java问题。我补充了这个问题,以进一步解释。

没有任何特定于Android的东西,这就是为什么我没有将其标记为Android,但枚举是在类中定义的,我不想切换的代码在.枚举是静态的,因为我需要从多个活动访问它。ApplicationActivity


答案 1

您缺少的部分正在从整数转换为类型安全的枚举。Java不会自动执行此操作。有几种方法可以做到这一点:

  1. 使用静态最终 ints 列表而不是类型安全的枚举,然后打开您收到的 int 值(这是 Java 5 之前的方法)
  2. 打开指定的 id 值(如 heneryville 所述)或枚举值的序号值;即guideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
  3. 确定由整型值表示的枚举值,然后打开枚举值。

    enum GuideView {
        SEVEN_DAY,
        NOW_SHOWING,
        ALL_TIMESLOTS
    }
    
    // Working on the assumption that your int value is 
    // the ordinal value of the items in your enum
    public void onClick(DialogInterface dialog, int which) {
        // do your own bounds checking
        GuideView whichView = GuideView.values()[which];
        switch (whichView) {
            case SEVEN_DAY:
                ...
                break;
            case NOW_SHOWING:
                ...
                break;
        }
    }
    

    您可能会发现编写一个自定义实现更有帮助/更不容易出错,该实现将整数值作为参数来解析适当的枚举值,并允许您集中边界检查。valueOf


答案 2

如果 是 GuideView Enum 的对象,则以下操作效果很好。请注意,后面的常量没有限定符。whichViewcase

switch (whichView) {
    case SEVEN_DAY:
        ...
        break;
    case NOW_SHOWING:
        ...
        break;
}