2013-10-30 4 views
19

ho una enum 'classe' chiamato Example come segue:Come utilizzare enum con il raggruppamento e la gerarchia sottogruppi/nidificazione

enum Example { 
//enums belonging to group A: 
    enumA1, 
    enumA2, 
    enumA3, 
//enums belonging to group B: 
    enumB1, 
    enumB2, 
    enumB3, 
//enums belonging to group C: 
    enumC1, 
    enumC2, 
    enumC3; 
} 

E 'importante per il mio progetto che tutte le enumerazioni con cui lavoro appartengono a Example (dal momento che questo è un argomento in un costruttore di una classe).

Come faccio a utilizzare enum gerarchia/nidificazione, al fine di conseguire i seguenti obiettivi:

  • Un metodo che verifica se un enum è di gruppo A, B o C. Ad esempio, qualcosa come Example.enumA1.isGroupBelonging(Group.A) o isGroupBelonging(Example.enumA1,Group.A) sarebbe un metodo pubblico che restituisce vero.

  • Essere in grado di fare la stessa cosa con i sottogruppi del gruppo A, B e C. Ad esempio, il gruppo A potrebbe avere sottogruppi a, b e c. Quindi voglio un metodo che faccia qualcosa come Example.enumA1.isSubGroupBelonging(SubGroup.a) che sia un public boolean.

  • Un modo per fare tutto questo senza la necessità di avere un nome elaborato enum che intasa il mio codice. Per esempio, sarebbe bello essere solo in grado di fare riferimento a Example.enumA1 durante i miei altre classi senza la necessità di fare riferimento ad esso utilizzando qualcosa di simile Example.enumA1(Group.A,SubGroup.a) o Example.enumA1.Group.A.SubGroup.a

risposta

39

avrei usato un semplice costruttore di enum che associa il corrispondente gruppo con il valore enum:

public enum Example { 

    ENUM_A1 (Group.A), 
    ENUM_A2 (Group.A), 
    ENUM_A3 (Group.A), 

    ENUM_B1 (Group.B), 
    ENUM_B2 (Group.B), 
    ENUM_B3 (Group.B), 

    ENUM_C1 (Group.C), 
    ENUM_C2 (Group.C), 
    ENUM_C3 (Group.C); 

    private Group group; 

    Example(Group group) { 
     this.group = group; 
    } 

    public boolean isInGroup(Group group) { 
     return this.group == group; 
    } 

    public enum Group { 
     A, 
     B, 
     C; 
    } 
} 

Usage:

import static Example.*; 
import Example.Group; 
... 

ENUM_A1.isInGroup(Group.A); // true 
ENUM_A1.isInGroup(Group.B); // false 

Per fare i sottogruppi si può fare un simile tipo di struttura per Gruppo come per Esempio, utilizzando Group(SubGroup ... subgroups) come costruttore e un EnumSet<SubGroup> per contenere i sottogruppi.

+2

Ottima soluzione! Vorrei anche aggiungere il metodo 'getGroup()' per ottenere il gruppo corrente. – Shahar

+0

Soluzione molto elegante :-) grazie! – Gilbou

23

È possibile utilizzare EnumSet di raggruppare varie enumerazioni senza creare una classe separata Enum:

public enum Example { 

    ENUM_A1, ENUM_A2, ENUM_A3, 
    ENUM_B1, ENUM_B2, ENUM_B3, 
    ENUM_C1, ENUM_C2, ENUM_C3; 

    public static EnumSet<Example> groupA = EnumSet.of(ENUM_A1, ENUM_A2, ENUM_A3); 
    public static EnumSet<Example> groupB = EnumSet.of(ENUM_B1, ENUM_B2, ENUM_B3); 
    public static EnumSet<Example> groupC = EnumSet.of(ENUM_C1, ENUM_C2, ENUM_C3); 

} 

public static void main(String[] args){ 
    if(Example.groupA.contains(Example.ENUM_A1)){ 
     System.out.println("Group A contains ENUM A1"); 
    } 
} 
+3

Anche visto [qui] (http://jaxenter.com/enumset-in-java-regularenumset-vs-jumboenumset-106051.html) – ccDict

+2

esiste un ordine garantito in EnumSet? ad esempio, desidero le enumerazioni per il gruppoA nell'ordine seguente ENUM_A3, ENUM_A1, ENUM_A2 .. Non sono sicuro che EnumSet mi garantisca l'ordine – Ewoks

+2

EnumSet non garantisce l'ordine, ma puoi utilizzare il file Collections.sort (new ArrayList (Example.groupA)) 'per ordinarlo! – Wendel

Problemi correlati