Comment utiliser enum avec groupement et sous-groupement hiérarchie / imbrication

j'ai un enum 'classe'Example comme suit:

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

c'est important pour mon projet que tous les enums avec lesquels je travaille appartiennent à Example (puisque c'est un argument dans un constructeur d'une classe).

comment utiliser enum hiérarchie et d'imbrication dans le but d'atteindre les objectifs suivants:

  • Une méthode qui teste si un enum est du groupe A, B ou C. par exemple, quelque chose comme Example.enumA1.isGroupBelonging(Group.A) ou isGroupBelonging(Example.enumA1,Group.A) serait une méthode publique qui renvoie la valeur true.

  • Être capable de faire la même chose avec les sous-groupes du groupe A,B et C. Par exemple, le groupe A pourrait avoir des sous-groupes a,b et c. Je veux une méthode qui fait quelque chose comme Example.enumA1.isSubGroupBelonging(SubGroup.a) est un public boolean.

  • Une façon de faire tout cela sans avoir besoin d'avoir quelques élaborer enum nom qui bloque mon code. Par exemple, il serait agréable de pouvoir se référer à Example.enumA1 tout au long de mes autres cours sans avoir besoin de s'y référer en utilisant quelque chose comme Example.enumA1(Group.A,SubGroup.a) ou Example.enumA1.Group.A.SubGroup.a

19
demandé sur ekad 2013-10-30 15:01:07

2 réponses

j'utiliserais un constructeur enum très simple qui associe le groupe correspondant avec la valeur 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;
    }
}

Utilisation:

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

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

pour faire les sous-groupes vous pouvez faire un type similaire de structure pour le groupe comme par exemple, en utilisant Group(SubGroup ... subgroups) comme un constructeur et un EnumSet<SubGroup> pour contenir les sous-groupes.

39
répondu ᴇʟᴇvᴀтᴇ 2013-10-30 11:41:22

Vous pouvez utiliser EnumSet pour grouper plusieurs énums sans créer un Enum catégorie:

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");
    }
}
25
répondu Wendel 2015-09-01 22:27:15