0

使用包含switch可用项目的详尽列表(例如enum)的语句时,如果每个项目都有自己的条件代码,我应该使用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()方法还是那个withoutDefault()?或者也许只是口味问题?

4

4 回答 4

11

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

于 2012-11-14T16:42:23.803 回答
2

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

于 2012-11-14T16:42:52.687 回答
1

这取决于你的要求。在中,除第二部分withDefault()之外的任何类型,即,但在 中不是这种情况,这是更排他的。TYPE1defaultwithoutDefault()

我更喜欢withoutDefault() *with added default to throw some exception的一些不同版本),因为它只支持预先确定的enums并且枚举中的任何更改都会引起您的注意。

如果您认为除 Type1 以外的任何内容都应始终设为默认值,那就withDefault()更好了。

于 2012-11-14T16:44:34.183 回答
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.");
        }

更好的方法是使用命令模式而不是switch大块。使用不断增加的switch块可能会使您的代码混乱并使其更难以维护。

于 2012-11-14T16:45:14.403 回答