1

switchステートメントを含む Java メソッドがあります。

正常に動作していますが、以下に示すように、おそらく 20 以上のケースが多数あります。

switch (result)  // result is of type Enum
{
    case 1:
        break;

    case 2:
        break;

    //----
    //----
    //----

    default:
        break;
}  // End of Switch 

これらのケースを別のファイルに移す方法を教えてください。

4

6 に答える 6

6

いいえ、Java には C のような #include 機能はありません。

単純にロジックをリファクタリングする方がよいでしょう。あなたがまったく質問しているという事実は、より良い抽象化が必要になる可能性があることを示しています。

ただし、少なくとも次のことができます。

public class HandleCases {

    public static Result handleCase1(...parameters...) {
        ...
    }

    public static Result handleCase2(...parameters...) {
        ...
    }

    public static Result handleCase3(...parameters...) {
        ...
    }
}

その後:

Result r = null;

switch(flag) {

    case 1:
        r = HandleCases.handleCase1( ... );
        break;

    case 2:
        r = HandleCases.handleCase1( ... );
        break;

    case 3:
        r = HandleCases.handleCase1( ... );
        break;
    ...
 }

結果ホルダーは、必要な値を取得できる場所です。

しかし、全体としてこれはパッチワークであり、あなたのデザインはおそらくいくつかの作業を必要とする可能性があります。

于 2012-04-13T13:56:49.380 に答える
4

スイッチ条件が実際の列挙型の場合、列挙型にメソッドを実装できます。

public enum Colors {
    RED { public void run() { /* do stuff for red */ } },
    GREEN { public void run() { /* do stuff for green */ } },
    BLUE { public void run() { /* do stuff for blue */ } },

    public abstract void run();  
}

スイッチはメソッド呼び出しになります。

Color result = ...;
// was switch (result) { case RED: ... }
result.run();

その結果、「スイッチ」は別のファイルになります。列挙型を使用すると簡単になりますが、すべての「スイッチ」コードが 1 つのファイル (列挙型のファイル) に含まれています。同じパターンに従って、各定数を独自のシングルトン クラスで定義し、すべて同じインターフェイス/抽象クラスを実装して、個別のファイルで各条件を取得することができます。

同じ定数で異なることを行うスイッチが多数ある場合、探索する別のオプションは訪問者パターンです。 http://en.wikipedia.org/wiki/Visitor_pattern

于 2012-04-13T14:00:51.047 に答える
3

再設計せずにすぐに解決できる場合は、Willの解決策を使用できます。しかし、彼がすでに指摘したように、あなたは再設計を行うべきだと思われます。

これについては、 http://c2.com/cgi/wiki?SwitchStatementsSmellの次のコード例を検討してください。これは、手動のswitchステートメントの代わりに動的ディスパッチを使用します。

method foo(int thingType) {
    switch (thingType) {
        case TYPE_ONE:
            oneFoo();
            break;
        case TYPE_TWO:
            twoFoo();
            break;
        case TYPE_THREE:
            threeFoo();
            break;
        case TYPE_FOUR:
            fourFoo();
            break;
    }
}


method oneFoo() {
}


method twoFoo() {
}


method threeFoo() {
}


method fourFoo() {
}


method bar(int thingType) {
    switch (thingType) {
        case TYPE_ONE:
            oneBar();
            break;
        case TYPE_TWO:
            twoBar();
            break;
        case TYPE_THREE:
            threeBar();
            break;
        case TYPE_FOUR:
            fourBar();
            break;
    }
}


method oneBar() {
}


method twoBar() {
}


method threeBar() {
}


method fourBar() {
}

class one extends base {
    method foo() {
    }
    method bar() {
    }
}
class two extends base {
    method foo() {
    }
    method bar() {
    }
}
class three extends base {
    method foo() {
    }
    method bar() {
    }
}
class four extends base {
    method foo() {
    }
    method bar() {
    }
}

anObjectOfTypeBase.foo()次に、とを呼び出すだけですanObjectOfTypeBase.bar()

于 2012-04-13T14:12:55.897 に答える
3

そんなことはできません。ただし、同じ条件に対して複数の case ステートメントがある場合は、それらをグループ化することができます。これはフォール スルーと呼ばれます。

switch(flag) {
    case 1:
    case 3:
    case 5:
        System.out.println("Odd");
        break;
    case 2:
    case 4:
    case 6:
        System.out.println("Even");
        break;
}
于 2012-04-13T13:52:46.603 に答える
1

それはあなたがそれをどのようにやりたいかによって異なります。

まず、ロジックが同じクラスに関連している (そして密結合している) 場合は、別のクラスに移すことはできません。ただし、ロジックをこのクラスから別のクラスに分離したい場合は、switchステートメントを実行するだけの静的メソッドを別のクラスに作成することができます。

または、20 の switch ステートメントが不要になるように、コードを見直してリファクタリングすることもできます。

于 2012-04-13T13:55:13.923 に答える
1

いいえ、できません。Java では、同じクラスのコード全体、さらには同じメソッドまたはステートメントのコードを同じファイルに配置する必要があります。

多くのケースがある場合にできることは、アプローチで「スイッチ」アプローチを変換しすぎることHashMapです。たとえば、抽象クラスを作成し、さまざまなファイルのさまざまなクラスでActionある多くのアクションを入れることができます。Map次に、コードで次のようなことができます。

Action action = map.get(result);
if (action != null)
   action.execute();
else
   // default case

このパターンはコマンド パターンと呼ばれます。

于 2012-04-13T13:53:01.170 に答える