3

後で参照する場合:

Operations o = new Operations(); //class containing the operation methods
HashMap<String, Method> ops = new HashMap<String, Method>();

私は、コンソールまたは最終的には GUI を介して入力された数式を解析するプログラムに取り組んでいます。

現在、さまざまな基本的な数学関数を備えた "Operations" というクラスがあります (後で追加される予定で、現在テスト中です)。別のクラスには、オペランド、連続する演算子、および別のオペランドを取得し、メソッドを呼び出して式を評価することによって結果を計算するメソッドがあります。計算に必要な情報を次の場所に保存します。

double numOne = //...
char operator = //...
double numTwo = //...
double result = //...

switch今、私は長い/caseステートメントや次のようなステートメントを持ちたくありませんif:

if (operator.equals("+")) //I know .equals() doesn't use chars; it's an example
     o.add(numOne, numTwo);
else if (operator.equals("-"))
     o.subtract(numOne, numTwo);

操作ごとに何度も。というわけでHashMap<String, Method>、演算子(String)と呼び出すべきメソッドを格納する を作成してみました。基本的に、現在のクラスのコンストラクターに次のように記述します。

ops.put("+", o.getClass().getMethod("add", double.class, double.class));
ops.put("-", o.getClass().getMethod("subtract", double.class, double.class));
//etc. Which in and of itself is also pretty lengthy

演算子を介してメソッドが識別されると、Method呼び出し先を返す別のメソッドが必要になります。

private Method getMethodFromKey(HashMap<String, Method> map, char op) {
    Method method = null;
    for (Map.Entry<String, Method> e: map.entrySet()) {
        if (e.getKey().equals(op))
            method = e.getValue();
    }
    return method;
}

最後に、正しいメソッドを取得したら、次のように呼び出すことができます。

getMethodFromKey(ops, operator).invoke(o, numOne, numTwo);

それはすべてうまくいきます。私の問題は、私が呼び出している/呼び出すメソッドがゲッターメソッドであることです。double を返します。例:

public double add(double one, double two) {
    double answer = 0;
    answer = one + two;
    return answer;
}

これはすべて、innvoked メソッドの戻り値を割り当てる方法はありますか? 何かのようなもの:

result = getMethodFromKey(ops, operator).invoke(o, numOne, numTwo); //This doesn't work :(

どんな助けでも大歓迎です。さらに、私のアプローチが完全に間違っている場合は、正しい方向に進んでいただければ幸いです。


免責事項: 私は Java の経験が比較的浅く、複雑すぎることで知られています。そのため、私の設計に重大な欠陥があれば指摘してください。:)

4

3 に答える 3

1

すべての操作が 1 つのクラス (拡張性なし) で実行されることが確実な場合は、enum代わりに を使用することを検討してください。インスタンス フィールドを に追加して、操作に対応する文字コマンドを表し、各値によって実装されるenum抽象メソッドを持つことができます。evaluateenum

于 2013-08-02T01:16:08.517 に答える