带有详尽列表的switch语句:默认标签是否相关?

时间:2012-11-14 16:40:02

标签: java switch-statement

使用switch语句时,包含可用项目的详尽列表(例如enum),并且如果每个项目都有自己的条件代码,我应该使用{{ 1}}标签?例如:

default

在这种情况下,我应该使用什么:public class MyClass { public enum Type { TYPE1, TYPE2 } private Type type; public void withDefault() { switch (type) { case TYPE1: // some conditional code for TYPE1 break; default: // some conditional code for TYPE2 break; } } public void withoutDefault() { switch (type) { case TYPE1: // some conditional code for TYPE1 break; case TYPE2: // some conditional code for TYPE2 break; } } } 方法或withDefault()方法?或者也许只是品味问题?

4 个答案:

答案 0 :(得分:11)

我通常为每个TYPE1和TYPE2使用一个case,然后是一个抛出异常的默认值,以便稍后添加一个类型时异常将提醒我更改开关。

答案 1 :(得分:2)

这对于将来的打样非常方便。当你有一个详尽的列表时,默认抛出一个IllegalStateException或类似的东西,表明系统中的某些东西发生了变化

答案 2 :(得分:1)

这取决于你的要求。在withDefault()中,TYPE1以外的任何类型都在第二部分default中,但在withoutDefault()中不是这种情况,更为排他。

我更喜欢withoutDefault() *的一个不同版本,并添加默认值以抛出一些异常),因为它只支持预先确定的enums,并且枚举中的任何更改都将引起你的注意。

如果您认为Type1以外的任何内容应始终转为默认值,那么withDefault()会更好。

答案 3 :(得分:1)

我认为这取决于您的偏好。例如,当您认为enum中没有新条目并且有人将其添加到您的背后并且这会破坏您的代码时,我可以想象出这种情况。因此,在这种情况下,最好在默认情况下抛出Exception

        switch (type) {
        case TYPE1:
            // some conditional code for TYPE1
            break;
        case TYPE2:
            // some conditional code for TYPE2
            break;
            // ...
        default:
            throw new IllegalArgumentException("This type is not yet supported.");
        }

更好的方法可能是使用Command Pattern而不是大switch块。使用不断增加的switch块可能会使代码混乱并使维护更加困难。