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 ごとにケースを使用し、次に例外をスローするデフォルトを使用します。これにより、後でタイプが追加されたときに、例外によってスイッチを変更するように通知されます。

于 2012-11-14T16:42:23.803 に答える
2

これは、将来の校正に便利です。網羅的なリストがある場合、デフォルトで IllegalStateException などをスローして、システムで何かが変更されたことを示します。

于 2012-11-14T16:42:52.687 に答える
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 に答える
1

それはあなたの要件に依存します。ではwithDefault()、 以外のタイプはすべてTYPE12 番目のセクションに入ります。つまり、ではdefaultそうではなく、より排他的です。withoutDefault()

事前に決定されたもののみをサポートし、列挙型の変更が注目されるため、少し異なるバージョンのwithoutDefault() * with default to throw some exception )を好みます。enums

Type1 以外は常にデフォルトにする必要があると思われる場合は、そのwithDefault()方が適切です。

于 2012-11-14T16:44:34.183 に答える