Pourquoi est Classe.newInstance ()"mal"?


Ryan Delucchi a demandé à ici dans le commentaire # 3 à la réponse de Tom Hawtin:

Pourquoi est la classe.newInstance ()"mal"?

Ceci en réponse à l'exemple de code:

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

Alors, pourquoi est-ce mauvais?

Author: Community, 2008-10-12

2 answers

La documentation de l'API Java explique pourquoi (http://java.sun.com/javase/6/docs/api/java/lang/Class.html#newInstance()):

Notez que cette méthode propage toute exception levée par le constructeur nullary, y compris une exception vérifiée. L'utilisation de cette méthode contourne efficacement la vérification des exceptions à la compilation qui serait autrement effectuée par le compilateur. La méthode Constructor.newInstance évite ce problème en encapsulant toute exception levée par le constructeur dans a (checked) InvocationTargetException.

En d'autres termes, il peut vaincre le système d'exceptions vérifiées.

 77
Author: Chris Jester-Young, 2008-10-12 10:43:31

Une raison de plus:

LesEs modernes vous permettent de trouver des utilisations de classe - cela aide pendant le refactoring, si vous et votreE savez quel code utilise la classe que vous prévoyez de changer.

Lorsque vous ne faites pas une utilisation explicite du constructeur, mais utilisez la classe.newInstance() au lieu de cela, vous risquez de ne pas trouver cette utilisation pendant le refactoring et ce problème ne se manifestera pas lors de la compilation.

 18
Author: alexei.vidmich, 2008-10-13 03:46:53