11
votes

Méthode de style d'usine Enum

Dans mon application, plusieurs rapports différents peuvent être générés (CSV, HTML, etc.).

Au lieu de créer un modèle de méthode de style usine traditionnel, je prévoyais d'ajouter une méthode au corps des constantes d'énumérum qui seraient Créez et renvoyez l'objet de rapport approprié. P>

ReportType.CSV.create()


0 commentaires

4 Réponses :


1
votes

Joshua Bloch (Expert Java reconnu) recommande cette approche dans son livre efficace Java 2nd Edition à la page 17: appliquer la propriété singleton avec un privé constructeur ou un type d'énum.


1 commentaires

C'est en ce qui concerne les singletons.



3
votes

Quel est l'avantage que vous gagnez en utilisant Enum par exemple de la création de rapports? Si vous aviez la méthode d'usine, vous auriez créé une instance de CSVREPORTE (par exemple) comme ci-dessous: xxx

que je pense transmettre l'intention mieux que l'énum. Si je comprends bien les énumérations représentent un ensemble de constantes fixes, et l'utiliser comme une usine, par exemple la création (bien que des œuvres) me semble abuser de l'intention de dénombrement.


2 commentaires

Point valide. Enum's en Java sont souvent utilisés de manière à seulement contenir des constantes telles quelles sont des cours. Je suppose que je préfère la simplicité qui compte tenu d'un type de rapport, je peux alors choisir de le créer sans aucune usine. Cela ne nécessiterait pas nécessairement un code supplémentaire pour l'usine.


Le point d'utiliser Enums, et en effet d'usines abstraites, est le point à laquelle vous décidez de la mise en œuvre des détails est supprimé du point de demander la création. (Donc, si vous n'allez jamais découpler ces points, il n'ya aucun point d'indirection prématurée.)



5
votes

Je pense que les deux approches sont correctes, mais si vous ne voulez pas savoir quel type de rapport vous générez, je pense que l'approche énumée est la meilleure. Comme:

Person person = null; 
//... retrieve the person instance from database and generate a 
//report with his/her prefered report type...
Report report = person.getReportType.create();


0 commentaires