J'ai trois types d'énums (itema, itemsb et itemsc) et un produit "produit". Jusqu'à présent, je passe une enum comme un paramètre pour mon constructeur de produit, avec trois constructeurs: produit de classe em> p> ENUM Exemple: Élémentsa em> P> public static void setActualProduct(Enum<?> itemType) {
actualProduct = new Product<?>(itemType);
3 Réponses :
Je ne comprends pas pourquoi vous définissez différentes énumes contenant juste des valeurs simples, au lieu de définir une seule énumée contenant des valeurs différentes. Quelque chose comme ceci:
Prévoyez-vous de répondre au point principal de sa question: " Passage d'une énumération générique en tant que paramètre de méthode pour un constructeur i>"?
Bonjour, nous l'avons fait comme ça parce que nous avons des centaines de produits différents de tous les groupes par types, chaque type avec ses propres propriétés.
D'ACCORD. Mais de cette façon, vous n'avez aucun avantage d'utiliser un énumé. La façon dont vous l'utilisez, cela ne rend que votre vie plus difficile imho. Si je comprends bien cela correctement, le type ressemble plus à un DTO des propriétés du produit. Donc, vous pourriez simplement définir une interface pour cela, pas besoin d'un énumé. Désolé si je ne réponds pas simplement à votre question directement, mais je ne suis pas certain s'il s'agit de la bonne solution pour votre problème.
Oui, c'est possible. Vous pouvez faire Enum code> implémente une interface code> commune code> et créer un constructeur à l'aide de l'interface code> code>. Voici l'exemple
interface GenericEnum{}
enum Item1 implements GenericEnum {
TOYS1;
}
enum Item2 implements GenericEnum {
TOYS2;
}
class Test {
public GenericEnum genericEnum;
public Test(GenericEnum genericEnum) {
this.genericEnum = genericEnum;
}
}
Vous pouvez laisser votre énumge implémenter une interface commune: quelques remarques WRT. Conventions de nommage: Les noms de classe doivent être singuliers ( Buysection code>, pas
Buysections code>), Enums doit commencer par des lettres majuscules (comme tous les types, par exemple
itemsa code> , pas
itemsa code>) p> p>
Tant que nous sommes de cette façon i> à propos de la nommage, ce ne serait pas un nom dans la langue du domaine business i> un meilleur choix qu'un nom dans Domaine de la programmation de la programmation I>? Je vote pour article i>.
... Ditto pour Fstenum code> i> et
sndenum code> i>.
@deduper Si je connaissais le domaine des affaires, j'aurais choisi les noms de type descriptifs. Mais je n'ai aucune idée de ce que itemsa code> devrait être et je ne parie pas une supposition. Je conviens absolument que les noms que j'ai choisis n'ont aucune place dans le code de production, mais je n'ai pas non plus d'indice quant à quelles classes ops devraient représenter en premier lieu.
Aller par l'exemple de code dans le message d'origine, je suppose que l'OP fonctionne dans un domaine dans lequel vous pouvez Acheter i> Différents produits i>. Evidemment, les produits i> vous pouvez acheter i> dans la boutique de l'OP sont i> sont Sectionalisalisés i> dans différents articles i> . Je ne sais pas que le domaine commercial réel réelle i> est plus que vous. Mais, les noms qu'il utilisaient à l'origine sont de très bons indices pour de meilleurs noms pour les nouveaux types de types de remplacement introduits dans son système. Je vote pour article i>.
@DEDUPER Je suis parfaitement parfaite sans attacher mon exemple à un domaine commercial spécifique. Bien sûr, dans l'affaire OPS qui pourrait être appropriée, mais n'oublie pas OP pourrait ne pas être la seule avec un problème similaire. Les noms de type sont complètement interchangeables de toute façon, son mécanisme important.
@deduper BTW, votre hypothèse peut être fausse, car OP appelle le paramètre constructeur itemType code>, indiquant que ce n'est pas en réalité un élément qu'ils modélisent, mais une sorte de classificateur.
Il me semble que vous puissiez simplement faire implémenter votre énumération une interface contenant getid, GetProductName et GetCategory. Ensuite, vous pouvez créer un produit à partir de n'importe quelle instance qui implémente cette interface.
Vous faites une opération différente pour différents paramètres Enum dans le constructeur comment il est possible