Perché è Classe.newInstance () "male"?


Ryan Delucchi ha chiesto qui nel commento # 3 a La risposta di Tom Hawtin :

Perché è Classe.newInstance () "male"?

Questo in risposta all'esempio di codice:

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

Allora, perché è il male?

Author: Community, 2008-10-12

2 answers

La documentazione dell'API Java spiega perché ( http://java.sun.com/javase/6/docs/api/java/lang/Class.html#newInstance()):

Si noti che questo metodo propaga qualsiasi eccezione generata dal costruttore nullary, inclusa un'eccezione selezionata. L'uso di questo metodo bypassa efficacemente il controllo delle eccezioni in fase di compilazione che altrimenti verrebbe eseguito dal compilatore. Il metodo Constructor.newInstance evita questo problema avvolgendo qualsiasi eccezione generata dal costruttore in un (controllato) InvocationTargetException.

In altre parole, può sconfiggere il sistema delle eccezioni controllate.

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

Un motivo in più:

Gli IDE moderni ti consentono di trovare gli usi della classe: aiuta durante il refactoring, se tu e il tuo IDE sapete quale codice sta usando la classe che prevedi di modificare.

Quando non si esegue un uso esplicito del costruttore, ma si utilizza la classe.newInstance () invece, si rischia di non trovare quell'utilizzo durante il refactoring e questo problema non si manifesterà quando si compila.

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