Utilisation de la réflexion en usine
Est-il une bonne pratique d'utiliser la Réflexion dans l'Usine modèle?
public class MyObjectFactory{
private Party party;
public Party getObject(String fullyqualifiedPath)
{
Class c = Class.forName(fullyqualifiedPath);
party = (PersonalParty)c.newInstance();
return party;
}
}
PersonalParty implémente Partie
source d'informationauteur Ullas
Vous devez vous connecter pour publier un commentaire.
Le but de l'usine modèle est de séparer un peu de code du type à l'exécution d'un objet qu'il consomme:
À l'aide de ce code, le
PartyFactory
est exclusivement responsable de la détermination ou de savoir exactement ce type à l'exécution doivent être utilisés.Vous êtes renoncer à cette prestation en passant le nom pleinement qualifié de la classe dont vous avez besoin. Comment est-ce...
... tout simplement déclarer
myParty
comme étant de typecom.example.parties.SurpriseParty
? À la fin de votre code est tout aussi couplé, mais vous avez renoncé statique type de vérification. Cela signifie que vous êtes encourir moins de pas de bénéfices, tandis que l'abandon de certains des avantages de Java étant fortement typé. Si vous supprimezcom.example.parties.SurpriseParty
votre code sera toujours compilé, votre IDE vous donnera pas de messages d'erreur et vous ne serez pas réaliser qu'il y a une relation entre ce code etcom.example.parties.SurpriseParty
jusqu'à l'exécution - qui est mauvais.À tout le moins, je vous conseille au moins de modifier ce code afin que la méthode de l'argument est un simple nom de la classe, pas un nom complet:
Suivante: est-ce une mauvaise pratique de l'utilisation
Class.forName(...)
? Cela dépend de ce que l'alternative est, et la relation entre cesString
arguments (name
) et les classes de cette usine. Si l'alternative est un grand conditionnelle:... ce n'est pas évolutive. Car il est évident observables relation entre les noms de l'exécution des types de cette usine qui fabrique et la valeur de la
name
argument, Vous devriez envisager d'utiliserClass.forName
à la place. De cette façon, votreFactory
objet est protégé besoin d'un changement de code chaque fois que vous ajoutez un nouveauParty
type de système.Quelque chose que vous pourriez envisager est l'aide de l'
AbstractFactory
motif de la place. Si votre consommation de code ressemble à ceci:... où il y a un nombre limité de souvent survenant partie des types qui sont demandées, vous devriez envisager d'avoir des méthodes différentes pour ces différents types de parties:
... qui vous permettra d'exploiter Java du typage statique.
Cette solution n'est, cependant, signifie que chaque fois que vous ajoutez un nouveau type de
Party
vous devez modifier le réglage d'usine de l'objet, de sorte que la réflexion de la solution ou de laAbstractFactory
est une meilleure solution dépend vraiment de combien de fois et combien de temps vous serez l'ajout deParty
types. Un nouveau type de tous les jours? Utiliser la réflexion. Un nouveau parti, le type de chaque décennie? Utiliser unAbstractFactory
.L'aide de la réflexion de cette façon (de la Classe.forName) est presque toujours le signe d'une mauvaise conception de l'application. Il y a quelques sortes, d'où son utilisation est OK, par exemple si vous faites une sorte de dynamique de la charge de bibliothèques externes ou des plugins.
Vous pouvez l'utiliser pour une API où vous fournir une API et XML configfile où les utilisateurs peuvent ajouter les noms de classe de leur plugin. Alors, oui, vous pouvez utiliser cette