2017-12-11 7 views
0

これはプログラミングに関する一般的な質問です。paramsを使用してメソッドを呼び出す

void printCells(cell[] cellArr, String method) { 
     for (int i = 0; i < cellArr.length; i++) { 
      cell c = cellArr[i]; 
      println(c.method); 
     } 
    } 

このコードは使用の私のしやすさのためだけのユーティリティ関数です、そして私のことができるようにしたい:私は関数にPARAMを置くことができるとparamは、例えばそのオブジェクトの呼び出しを持つようにしたいですvalue、row、col、subrow、およびsubcolの値を持つセルオブジェクト内の値を表示します。

printCells(cells, subrow); 

そして、それは私がcellArrとして渡すセルアレイと、内のすべてのセルオブジェクトからループについては、上記を通過し、副行値をオフに印刷されます:私は次のようにこの機能を使用したいです。

これも可能ですか?または、次のような長いif文が必要ですか。

void printCells(cell[] cellArr, String method) { 
     for (int i = 0; i < cellArr.length; i++) { 
     cell c = cellArr[i]; 
     if (method == "row"){ 
      println(c.row); 
     } else if (method == "col"){ 
      println(c.col); 
     } 
    } 

などです。私にお知らせください!

+1

リフレクションAPIを見てみましょう:HTTPS:/を/docs.oracle.com/javase/tutorial/reflect/ – wleao

答えて

2

あなたは、リフレクションを使用して、それはラムダを使用する可能性の方が簡単ですそれを行うことができます。私は、あなたが

printCells(cells, cell::getSubrow) 

または

printCells(cells, cell -> cell.subrow) // thanks to Lino for suggestion 
+0

ゲッターが使用できない場合は、次のものも使用できます。 'printCells(cells、c - > c.col)' – Lino

+0

これは私にとってはうまくいかないようです。自分のソリューションに自分のコードを貼り付けると、「クラスの関数は存在しません」と伝えられます。私はなぜこれが動作しないのかわかりません...関数を呼び出すためのリノのソリューションは、約11の異なるエラーを投げる –

+0

ああ、Javaのバージョンを使用していますか?私は8を仮定していた.. – xs0

1

ようなもので、それを呼び出すことができます

void printCells(cell[] cellArr, Function<cell, Object> getter) { 
    for (cell c : cellArr) 
     println(getter.apply(c)); 
} 

xs0の答えのようにlambdaやメソッド参照を使うのが望ましいと思いますが、呼び出す必要があるメソッドがonl yの名前で参照されるか、古いバージョンのJava(< 8)しか使用できない場合は、reflectionを使用する価値があります。

void printCells(cell[] cellArr, String getter) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { 
    Method getterMethod = cell.class.getMethod(getter); 
    for (cell c : cellArr) { 
     println(getterMethod.invoke(c)); 
    } 
} 

そして、それはそのように呼ばれることができます

printCells(cellArr, "getContent"); 

(アカウントで発生した例外を取らなければならないことに注意してください。)

関連する問題