2013-10-30 8 views
19

Ich habe eine enum ‚Klasse‘ Example wie folgt aufgerufen:Wie Enum mit der Gruppierung verwenden und Untergruppierung Hierarchie/Verschachtelung

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; 
} 

Es ist wichtig für mein Projekt, das sie alle Aufzählungen, mit dem ich Example gehören arbeiten (da dies ist ein Argument in einem Konstruktor einer Klasse).

Wie verwende ich enum Hierarchie/verschachteln, um folgendes zu erreichen:

  • Eine Methode, ob ein enum A, B oder C ist die Gruppe, beispielsweise so etwas wie Example.enumA1.isGroupBelonging(Group.A) oder isGroupBelonging(Example.enumA1,Group.A) testet wäre eine öffentliche Methode, die wahr zurückgibt.

  • Das Gleiche können Sie mit Untergruppen der Gruppe A, B und C erreichen. Zum Beispiel könnte Gruppe A die Untergruppen a, b und c haben. Ich möchte dann eine Methode, die etwas wie Example.enumA1.isSubGroupBelonging(SubGroup.a), die eine public boolean ist.

  • Ein Weg, all dies zu tun, ohne dass einige aufwendige enum Namen, die meinen Code verstopft haben müssen. Zum Beispiel wäre es schön, nur in der Lage sein zu Example.enumA1 während meiner anderen Klassen zu verweisen, ohne Bezug zu nehmen, um es so etwas wie Example.enumA1(Group.A,SubGroup.a) oder Example.enumA1.Group.A.SubGroup.a

Antwort

39

mit würde ich einen sehr einfachen Enum Konstruktor verwenden, die die entsprechenden zuordnet Gruppe mit dem eNUM-Wert:

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; 
    } 
} 

Verbrauch:

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

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

die Untergruppen tun Sie tun können ähnliche Art der Struktur für Gruppe als Beispiel, Group(SubGroup ... subgroups) als Konstruktor und EnumSet<SubGroup> zu verwenden, um die Untergruppen zu enthalten.

+2

Ausgezeichnete Lösung! Ich würde auch 'getGroup()' Methode hinzufügen, um die aktuelle Gruppe zu erhalten. – Shahar

+0

Sehr elegante Lösung :-) Danke! – Gilbou

23

können Sie EnumSet zur Gruppe verschiedene Aufzählungen verwenden, ohne eine separate Enum Klasse zu erstellen:

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

Auch gesehen [hier] (http://jaxenter.com/enumset-in-java-regularenumset-vs-jumboenumset-106051.html) – ccDict

+2

gibt es garantierte Reihenfolge in EnumSet? Zum Beispiel möchte ich enums für groupA in folgender Reihenfolge ENUM_A3, ENUM_A1, ENUM_A2 .. Nicht sicher EnumSet würde mir die Bestellung garantieren – Ewoks

+2

EnumSet garantiert nicht die Bestellung, aber Sie können 'Collections.sort (new ArrayList (Example.groupA)) verwenden 'um es zu bestellen! – Wendel