1

次のことを行うプログラムがある場合:

if(input=='abc'){do x}
if(input=='def'){do y}

将来的には、次のような別のコードを追加したいと思うかもしれません。

if(input=='ghy'){do x}

ご覧のとおり、同じ関数Xを使用して、別の条件付きの新しい'if'ステートメントを追加しています。将来のコードには、文字列とを比較するさまざまなIFステートメント(またはスイッチ)が多数含まれる可能性があります。文字列を実行してから関数を実行します。将来の拡張を考えると、同じ結果を達成するための「よりきれいな」、「モジュール式の」方法があるのではないかと思いました。

Javaのハッシュテーブル(String、method)でStringとMethod呼び出しを組み合わせることができないのは残念です。そうすれば、新しいプロシージャをハッシュテーブル内に格納して、その文字列に関連するメソッドを取得できます。

何か案は?

ありがとうございました

編集:みんなの解決策をありがとう。こんなに短い時間で届いた返事の量と質に驚きました。

4

4 に答える 4

4

多分あなたは使うことができますenum。例:

public enum InputType
{

    abc, def
    {
        @Override
        public void x()
        {
            System.out.println("Another method");
        }
    },
    ghy;

    public void x()
    {
        System.out.println("One method");
    }
}

そしてさらに:

InputType.valueOf("abc").x();

乾杯!

于 2011-02-20T15:01:29.563 に答える
1

いつでもMap<String、Runnable>を使用して、匿名のRunnable実装にマップできると思います。

myMap.put("abc", new Runnable() { public void run() { do x } });

...

myMap.get(input).run();
于 2011-02-20T14:55:09.220 に答える
1

コマンドパターンを見てください。それを実装するにはいくつかの方法があり、Spring などのフレームワークは、クリーンな方法で行うのに役立ちます。

しかし、簡単に言えば、次のことができます。

1-プログラムがタスクを実行するために呼び出す必要があるメソッド、たとえば doTask() を使用して Command インターフェイスを作成します。

2-Command インターフェイスを実装して、コマンド X および Y のクラスを作成します。

3-Map<String, Command>コマンド (X および Y) を論理名にマップする を作成します。

4-入力をコマンド名にマップする.propertiesファイルなど、選択した構成ファイルを作成します:abc = X、def = Y、ghi = X

5-次に、プログラムは構成ファイルを検索して、入力に従って実行するコマンドを認識します。

于 2011-02-20T15:11:43.400 に答える
0

多くの if は、これをもっとうまくやることができると常に言っています。あなたの場合、より良いオプションは、責任の連鎖などの設計パターンを使用することです。動的に変更できる優れた実装があり、ifs 実装よりもコードの保守が容易になります。

あなたのケースに対する責任のこの適応チェーンを見てください:

主要:

public static void main(String[] args) {
    ClassA classA = new ClassA(Arrays.asList("abc", "ghi"));
    ClassB classB = new ClassB(Arrays.asList("def"));
    classA.setNextInChain(classB);  // you can always write Builder to do this
    String input = "def";
    classA.execute(input);
}

ベースクラス:

public abstract class BaseClass {
    private Collection<String> patterns = Collections.EMPTY_LIST;
    protected BaseClass nextInChain;
    protected abstract void doMethod();  // your doA, doB methods

    public void execute(String input) {
            // this replace many ifs in your previous implementation
        if (patterns.contains(input)) {
            doMethod();
        } else {
            nextInChain.execute(input);
        }       
    }

    public void setPatterns(Collection<String> patterns) {
        this.patterns = patterns;
    }

    public void setNextInChain(BaseClass nextInChain) {
        this.nextInChain = nextInChain;
    }
}

チェーン内のクラス:

public class ClassA extends BaseClass {
    ClassA(Collection<String> patterns) {
        setPatterns(patterns);
    }
    @Override
    protected void doMethod() {
        // do A     
    }
}

public class ClassB extends BaseClass {...}
于 2011-02-20T15:04:24.830 に答える