jsp から、スイッチに使用できる文字列を取得します
switch(value)
case 0: method0(); break;
case 1: method1(); break;
...
または反射の場合:
c.getMethod("method"+value, parameter);
...
どちらのアプローチがより効率的ですか?
jsp から、スイッチに使用できる文字列を取得します
switch(value)
case 0: method0(); break;
case 1: method1(); break;
...
または反射の場合:
c.getMethod("method"+value, parameter);
...
どちらのアプローチがより効率的ですか?
追加のレイヤーを通過する必要があるため、反射は明らかに高速ではありません。
ただし、このようなタスクにリフレクションを使用するのは間違った方法です。コードの保守が難しくなり、リフレクションが設計された本来の目的を果たせなくなるからです。
メソッドの数が決まっていて、 1000 個の異なるsを入力するのが面倒な場合は、間違いなく を使用します。そのステートメントは JVM バイトコード レベルで高度に最適化されているためです。case
switch
メソッドの数が無数にある場合は、リフレクションを使用できます(おそらく他に選択肢はありません)。それでも、取得したインスタンスをキャッシュするMethod
ことでプロセスを高速化できますgetMethod()
。
リフレクションを介して引数を渡すと、常にClass
es とObject
s の余分な配列が作成されることに注意してください。
リフレクションには常にいくらかのオーバーヘッドがあります
javadocから
リフレクションには動的に解決される型が含まれるため、特定の Java 仮想マシンの最適化は実行できません。したがって、リフレクト操作は、リフレクション操作を行わない操作よりもパフォーマンスが低下するため、パフォーマンスが重視されるアプリケーションで頻繁に呼び出されるコードのセクションでは避ける必要があります。
より速いパフォーマンスを求めている場合、リフレクションには大きなオーバーヘッドがあります。Oracle Javaチュートリアルによると:
リフレクションには動的に解決される型が含まれるため、特定の Java 仮想マシンの最適化は実行できません。したがって、リフレクト操作は、リフレクション操作を行わない操作よりもパフォーマンスが低下するため、パフォーマンスが重視されるアプリケーションで頻繁に呼び出されるコードのセクションでは避ける必要があります。
lookupswitch
Java VM には、 やのような大文字と小文字の切り替えに使用できる特別なバイトコードがありtableswitch
ます。
実装できる場合の最善のアプローチは、オブジェクト指向アプローチであるポリモーフィズムです。
スイッチを使用
リフレクションは強力ですが、むやみに使うべきではありません。リフレクションを使用せずに操作を実行できる場合は、リフレクションを使用しないことをお勧めします。
メモリに比べてリフレクションが重いため、switch オプションを使用することをお勧めします。また、リフレクション中に switch ステートメントで処理できるように使用できない場合は、入力の例 * があるため、使用できないメソッド method* を探すことができます。
基本的に、いつリフレクションを使用するかを最初に理解しますか?型のインスタンスを動的に作成する、型を既存のオブジェクトにバインドする、または既存のオブジェクトから型を取得するためのリフレクションに主に使用されます。その後、型のメソッドを呼び出したり、そのフィールドやプロパティにアクセスしたりできます。
しかし、ここではそのようなケースはありませんので、リフレクションの代わりにswitch を使用することをお勧めします。
また、プロセスの不要な負担を回避します。