後で参照する場合:
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 の経験が比較的浅く、複雑すぎることで知られています。そのため、私の設計に重大な欠陥があれば指摘してください。:)