2010-09-04 2 views
0

Je construis des valeurs enum qui ont une structure de données comme les suivantes:Meilleur modèle pour la construction de cet objet?

enum MetaType { 
HUMAN(
    new MetaTypeAttribute(AttributeType.BODY, 1, 6), 
    new MetaTypeAttribute(AttributeType.AGILITY, 1, 6), 
    new MetaTypeAttribute(AttributeType.REACTION, 1, 6) 
), 
ORK(
    new MetaTypeAttribute(AttributeType.BODY, 4, 9), 
    new MetaTypeAttribute(AttributeType.AGILITY, 1, 6), 
    new MetaTypeAttribute(AttributeType.REACTION, 1, 6) 
); 

MetaType(MetaTypeAttribute body, MetaTypeAttribute agility, MetaTypeAttribute reaction) { 
} 
} 

Donc il y a un ENUM de metatypes; Chaque MetaType spécifie un ensemble fixe de MetaTypeAttributes, qui consiste en une valeur min et max pour cet attribut.

Je déteste cette syntaxe. C'est trop long, c'est moche, et ça ne m'empêche pas de passer dans le mauvais AttributeType (le AttributeType doit correspondre à l'ordre des arguments du constructeur de MetaType, AttributeType.BODY> body, etc.). Ce que je veux, c'est un meilleur modèle pour s'assurer qu'un objet est construit avec ce schéma exact.

Ce code est abrégé. En réalité, il y a 9 AttributeTypes.

Des suggestions d'amélioration?

Répondre

1
enum MetaType { 
HUMAN(new MyRange(1,1), new MyRange(1, 10), new MyRange(1,10) 
), 
ORK(new MyRange(1,1), new MyRange(1, 10), new MyRange(1,10) 
); 

MetaType(MyRange body, MyRange agility, MyRange reaction) { 
     this.bodyAttrib = new MetaTaypAttibute(AttributeType.BODY, body); 
     this.agilityAttrib = new MetaTaypAttibute(AttributeType.AGILITY, agility); 
     this.reactionAttrib = new MetaTaypAttibute(AttributeType.REACTION, reactiony);} 
} 
+0

Merci! J'ai fini par utiliser ce modèle. Strictement parlant, je n'ai pas besoin de l'objet MetaTypeAttribute quand je le fais de cette façon; Je stocke juste une carte qui est remplie à partir des arguments du constructeur. – RMorrisey

0

Si vous considérez différents types d'attributs, vous devriez peut-être vraiment créer ces types d'attributs en tant que classes/sous-classes au lieu d'enums. Vous aurez tous les avantages de la POO pour gérer le comportement de chaque type (méthodes héritées, réécriture de méthodes, ...) et ils seront sécurisés.

abstract class AbstractTypeAttribute{ 
    private final int min, max; 
    public AbstractTypeAttribute(int min, int max){ 
     //... 
    } 
    //... 
} 

class Body extends AbstractTypeAttribute{ 
    public Body(int min, int max){ 
     super(min, max); 
     //... 
    } 
    //... 
} 

Vous devriez penser à le faire à la place des attributs meta et les méta-types aussi.

+0

Vous pouvez également hériter et remplacer des méthodes avec des énumérations. Et les enums sont entièrement sécurisés. Je ne vois pas d'avantage ici. Votre approche ne fournit pas de constantes, btw. – whiskeysierra

+0

Vous ne pouvez pas hériter d'enums, ils sont de facto définitifs. Les énumérations sont sécurisées, mais pas enumées, elles ne peuvent pas être utilisées en tant que type. Je ne sais pas de quelles constantes vous parlez. –

Questions connexes