100

Ryan Delucchiは、 Tom Hawtinの回答に対するコメント#3でここに質問しました。

Class.newInstance()が「悪」なのはなぜですか?

これは、コードサンプルに対応しています。

// Avoid Class.newInstance, for it is evil.
Constructor<? extends Runnable> ctor = runClass.getConstructor();
Runnable doRun = ctor.newInstance();

それで、なぜそれは悪なのですか?

4

3 に答える 3

85

Java APIのドキュメントでは、その理由を説明しています(http://java.sun.com/javase/6/docs/api/java/lang/Class.html#newInstance()):

このメソッドは、チェックされた例外を含め、nullaryコンストラクターによってスローされたすべての例外を伝播することに注意してください。このメソッドを使用すると、コンパイラによって実行されるコンパイル時の例外チェックが効果的にバイパスされます。このConstructor.newInstanceメソッドは、コンストラクターによってスローされた例外を(チェック済み)でラップすることにより、この問題を回避しますInvocationTargetException

つまり、チェックされた例外システムを無効にすることができます。

于 2008-10-12T10:43:31.913 に答える
22

もう1つの理由:

最新の IDE では、クラスの使用箇所を見つけることができます。変更する予定のクラスを使用しているコードがわかっている場合は、リファクタリング中に役立ちます。

コンストラクターを明示的に使用せず、代わりに Class.newInstance() を使用すると、リファクタリング中にその使用法が見つからないリスクがあり、この問題はコンパイル時に現れません。

于 2008-10-13T03:46:53.843 に答える