2014-05-15 2 views
-1

J'essaie de trouver une manière compliquée d'obtenir mes valeurs enum complexes. Disons que nous avons quelque chose comme ceci:Créer des "enums composés" en Java

enum Country 
{ 
    USA, UK; 
} 

enum Person 
{ 
    ALICIA, BOB, CEDRICK, 
    USA_ALICIA, USA_BOB, USA_CEDRICK, 
    UK_ALICIA, UK_BOB, UK_CEDRICK; 
} 

Je voudrais avoir un mécanisme simple et court de quelque chose comme le moulage. Si country est Country.UK, (country)Person.BOB doit contenir la valeur Person.UK_BOB. Des idées pour y parvenir?

EDIT: nouvelle idée Je ne vois pas d'autre solution, car il existe différents Alicias des Etats-Unis et du Royaume-Uni et ils ont des propriétés différentes. Que diriez-vous à ce sujet?

enum Country 
    { 
     USA, UK; 
    } 

    enum Person 
    { 
     ALICIA, BOB, CEDRICK, 
     USA_ALICIA, USA_BOB, USA_CEDRICK, 
     UK_ALICIA, UK_BOB, UK_CEDRICK; 

     public Person from (Country country) 
     { 
      return Person.valueOf (country.toString().toUpperCase() + "_" + this.toString().toUpperCase()); 
     } 
    } 

// and the usage: Person.BOB.from(country); 
+0

Pourquoi avez-vous besoin que ce soit une énumération? Pourquoi pas une combinaison de ces deux enums? – Thilo

+0

C'est une partie de mon jeu. J'ai une classe qui gère les textures de divers comportements pour diverses créatures. Chaque type de comportement a sa propre enum appelée 'BehaviourType'. Et chaque créature a son propre ensemble de tels enums. En fonction de ce que la créature est, je voudrais juste écrire '(créature) BehaviourType.IDLE' – user3572544

+0

@ user3572544 J'appellerais cela un abus complet de la syntaxe même si vous pouviez le faire fonctionner; Je ne voudrais certainement pas travailler sur le code avec autant de connaissances cachées et de syntaxe confuse. Sois juste explicite. L'organisation des données fait partie des classes pour lesquelles elles ont été conçues. Avoir une classe avec quelques données d'instance; tout le reste essaie juste de réinventer la roue. – jpmc26

Répondre

0

Vous pouvez ajouter et remplacer une méthode enum pour chaque constante qui donne la valeur enum pour un pays spécifique

public Person forCountry(Country country) { 
    return SomePersonConstant; 
} 

Par exemple, pour BOB,

BOB { 
    @Override 
    public Person forCountry(Country country) { 
     if (country == UK) 
      return UK_BOB; 
     return BOB; // or other default value 
    } 
}, ... 
2

Je pense que vous allez à la mer avec enum s ici. Considérez ces faits: les pays du monde peuvent et changent, tout comme leurs propriétés (limites, population, beaucoup de choses) au fil du temps. De plus, votre liste de personnes peut changer au fil du temps, et il est peu probable que vous vouliez qu'une liste de personnes soit codée en dur dans une application du monde réel. Donc, ces deux types de données semblent inappropriés pour enum s. C'est un piège facile à prendre quand vous apprenez à programmer. (Bien, c'était pour moi, de toute façon.)

Plus au sujet de votre question, Country est clairement une propriété d'un Person, et devrait donc être une variable d'instance. Ceci est vrai même si vous ignorez mon conseil sur l'utilisation de enum s. Ce sont deux types de données très différents. Il est illogique que vous puissiez utiliser les données d'un Person où vous pourriez utiliser les données d'un Country, donc cela n'a pas de sens de transformer un Person en Country.

Donc, faites ces deux classes avec des données d'instance (probablement un nom au minimum), et faites Person avoir une variable d'instance de Country.