一般的な反射の欠点
反射は、直線のコードよりも理解しにくいです。
私の経験では、リフレクションはJavaの「エキスパートレベル」機能です。私は、ほとんどのプログラマーがリフレクションを積極的に使用しないことを主張します(つまり、リフレクションを使用するライブラリを使用してもカウントされません)。そのため、これらのプログラマーにとってコードの理解が難しくなります。
リフレクションコードは静的分析にアクセスできない
getFoo
クラスにゲッターがあり、名前をに変更したいとしgetBar
ます。リフレクションを使用しない場合、コードベースを検索するだけでgetFoo
ゲッターを使用するすべての場所を見つけることができるので、更新できます。
ゲッターを使用する場所のようなものである場合でもcallGetter("Foo")
とcallGetter
しgetClass().getMethod("get"+name).invoke(this)
、その後、上記の方法は、それを見つけることができません、とコンパイラが文句を言うことはありません。コードが実際に実行されたときのみ、を取得しNoSuchMethodException
ます。そして、その例外(追跡される)がcallGetter
「ハードコーディングされた文字列でのみ使用され、実際には発生しない」ために飲み込まれた場合の痛みを想像してください。(誰もそれをしないだろう、誰かが主張するかもしれない?OPが彼のSO回答でそれを正確に行ったことを除いて。ゲッターのユーザーは、運が良ければ、無視された例外のコンソール出力に気付くかもしれません。
リフレクションコードはコンパイラによって型チェックされません
これは基本的に上記の大きなサブポイントです。リフレクションコードはすべてですObject
。タイプは実行時にチェックされます。エラーは単体テストによって検出されますが、カバレッジがある場合のみです。(「単なるゲッターです。テストする必要はありません。」)基本的に、最初にJavaを使用することでPythonを使用する利点は失われます。
リフレクションコードは最適化に使用できません
理論上ではないかもしれませんが、実際には、のインラインキャッシュをインライン化または作成するJVMは見つかりませんMethod.invoke
。このような最適化には、通常のメソッド呼び出しを使用できます。それにより、それらは非常に高速になります。
リフレクションコードは一般的に遅い
リフレクションコードに必要な動的メソッド検索と型チェックは、通常のメソッド呼び出しよりも時間がかかります。その安価な1行ゲッターを反射獣に変えると、数桁の速度低下が見られるかもしれません(私はこれを測定していません)。
汎用ゲッター/セッターの欠点
あなたのクラスはもはやカプセル化されていないので、それは単なる悪い考えです。すべてのフィールドにアクセスできます。それらをすべて公開することもできます。