2009-10-09 8 views
2

Dans mon application Java je méthodeComment puis-je créer une instance de type dynamique en Java

public <T extends Transaction> boolean appendTransaction(T transaction) { 
    ... 
} 

et à l'intérieur de cette méthode que je dois créer une instance d'objet T qui étend Transaction

Est-il exact de le faire de cette façon

T newTransaction = (T) transaction.getClass().newInstance(); 

Répondre

2

Plus ou moins, sauf que Class.newInstance est mal:

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 d'exception de compilation qui serait sinon effectuée par le compilateur.

Utilisez plutôt transaction.getClass().getConstructor().newInstance(), elle enveloppe les exceptions lancées dans le constructeur avec un InvocationTargetException.

+0

Est-ce que plus de mal que juste un alias pour getConstructor(). NewInstance()? –

+0

J'ai mis à jour avec une motivation. Il renvoie magiquement toutes les exceptions lancées par le constructeur par défaut, même les exceptions vérifiées que vous ne pouvez pas saisir explicitement (parce que 'Class.newInstance' ne les déclare pas dans sa signature). – gustafc

5

Je pense que vous devriez utiliser une interface d'usine de type T, de cette façon vous pouvez forcer une interface de création-instance sur l'utilisateur de la méthode.

public <T extends Transaction> boolean appendTransaction(
     T transaction, 
     Factory<T> factory) { 
    ... 
    T newTransaction = factory.createTransaction(); 
    ... 
} 
+0

Je suis d'accord avec vous ici. C'est nettement plus propre et moins magique. – gustafc

Questions connexes