Java使用带有switch语句的枚举

Squ*_*onk 103 java enums switch-statement

我已经在SO上查看了类似于这个问题的各种问答,但还没有找到解决方案.

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

在NDroid Application类中

static enum guideView {
    GUIDE_VIEW_SEVEN_DAY,
    GUIDE_VIEW_NOW_SHOWING,
    GUIDE_VIEW_ALL_TIMESLOTS
}
Run Code Online (Sandbox Code Playgroud)

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

在Android Activity onClick(DialogInterface dialog, int which)事件处理程序中

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

我已经习惯了C#enums和select/case语句,这些语句允许类似上面的内容,我知道Java做的事情有所不同,但我无法理解我需要做什么.

我不得不诉诸if陈述吗?可能只有3个选择,所以我可以做到但我想知道如何用Java中的switch-case完成它.

编辑对不起我没有完全扩展这个问题,因为我认为它是一个通用的Java问题.我已经添加了这个问题来进一步解释.

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

Oph*_*ian 156

您缺少的部分是从整数转换为类型安全的枚举.Java不会自动执行此操作.您可以通过以下几种方式解决此问题:

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

    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;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 你需要在case语句中使用不合格的枚举名,所以`case GuideView.SEVEN_DAY:`给出了一个编译错误,它应该是`case SEVEN_DAY:`. (2认同)

Dha*_*hka 39

如果whichView是GuideView枚举的对象,则以下效果很好.请注意,之后的常数没有限定符case.

switch (whichView) {
    case SEVEN_DAY:
        ...
        break;
    case NOW_SHOWING:
        ...
        break;
}
Run Code Online (Sandbox Code Playgroud)

  • 这怎么可能?! (4认同)

Piy*_*too 12

枚举不应该像你拥有的那样在案例标签中合格NDroid.guideView.GUIDE_VIEW_SEVEN_DAY,而应该删除资格和使用GUIDE_VIEW_SEVEN_DAY


dav*_*lee 5

我喜欢Java枚举的一些用法:

  1. .name()允许您在String中获取枚举名称.
  2. .ordinal()允许您获取基于0的整数值.
  3. 您可以为每个枚举附加其他值参数.
  4. 当然,启用了开关.

枚举值参数:

    enum StateEnum {
        UNDEFINED_POLL  ( 1 * 1000L,       4 * 1000L),
        SUPPORT_POLL    ( 1 * 1000L,       5 * 1000L),
        FAST_POLL       ( 2 * 1000L,  4 * 60 * 1000L),
        NO_POLL         ( 1 * 1000L,       6 * 1000L); 
        ...
    }
Run Code Online (Sandbox Code Playgroud)

开关示例:

private void queuePoll(StateEnum se) {
    // debug print se.name() if needed
    switch (se) {
        case UNDEFINED_POLL:
            ...
            break;
        case SUPPORT_POLL:
            ...
            break;
Run Code Online (Sandbox Code Playgroud)