Java switch case - default vs explicit enumeration

时间:2011-01-11 03:21:59

标签: java switch-statement

我正在使用Java 6.

假设我有一个包含6个值的枚举,从A到F排序。大约4个值的处理方式相同。我可以这样写。

switch (whichType) {
    case A:
    case B:
    case C:
    case D:
        return task();
    case E:
        return someothertask();
    case F:
        return anothersomeothertask();
}

或者像这样。

switch (whichType) {
    case E:
        return someothertask();
    case F:
        return anothersomeothertask();
    default:
        return task();
}

空值永远不会到达此开关。

在简洁和清晰方面,第二种方法更好。就明确而言,我认为第一种方法更好。

每种方法还有其他优点/缺点吗?

此外,这个简单的问题可能会有重复,但我尝试过,但在任何地方都找不到它。如果我没有足够好地搜索它,我会道歉。

5 个答案:

答案 0 :(得分:7)

如果枚举绝对正确地固定在六个值,那么两者都很好。否则,请考虑枚举可能的第七个值。如果E和F是关于此switch逻辑的唯一两个可能的异常值,并且任何其他值将与A到D位于同一个桶中,请继续使用default。否则,每个值case更安全。

答案 1 :(得分:3)

假设有人在枚举中添加了一个值?

在我得到的一些代码中,有这种结构:

switch(mediaType) {
    case typeA:
    case typeB:
    case typeC:
        DoGeneric();
        break;
    case TypeD:
        DoSpecial();
        break;
}

这样做的原因是,如果有人为枚举添加了另一种可能性,那么在你查看使用枚举的位置并决定在那时需要完成什么之后,它就不会编译。没有机会错过一个并且有一个难以追踪的错误。

答案 2 :(得分:2)

嗯,关于可读性,我认为第二个可能不会更清楚。例如,您的常见情况发生在您的特殊情况之后。

然而,我在这里看到的真正问题是两段代码并不是真正等效的。在第一种情况下,您有六个明确的案例。在第二种情况下,您有两个明确的案例和一个默认案例。这意味着,如果您的代码遇到某种错误而您收到的案例没有预期,则默认情况仍会在第二种情况下执行(task()仍会运行)。因此,这与您的第一个代码根本不同。

除此之外(决定哪个开关语句是正确的),我会说坚持最适合你的那个。我个人喜欢第一个(因为它是明确的,如果需要的话,它可以为默认情况留出空间),但是您必须根据您的偏好或公司/团队的开发标准来决定。

答案 3 :(得分:2)

我倾向于使用 default 来捕获初始实现后添加的新枚举。这不会产生编译时错误,我不喜欢,但它通常不会通过烟雾测试。

switch (whichType) {
    case A:
    case B:
    case C:
    case D:
        return task();
    case E:
        return someothertask();
    case F:
        return anothersomeothertask();
    default:
        throw new IllegalArgumentException("Encountered unknown type: " + whichType.name());
}

答案 4 :(得分:0)

如果您正在编写某些业务场景,并且您希望代码在未来几年内(并由其他人维护)生存,请使用选项1.选项2没有任何问题,它很短,明确,但在讨论可维护性时,我认为选项1获胜 - 特别是如果案例与某些业务逻辑相关。维护工程师阅读它会容易得多。