java enums nested grouping hierarchy

java - Cómo usar enumeración con agrupación y subgrupo jerarquía/anidamiento



enums nested (3)

Pequeña adición:

Me gustan las respuestas de @ELEVATE y @Wendel. Y depende (como siempre) del escenario cuándo usar qué solución. Si cada entrada debe ser parte de un solo grupo, prefiero la solución de ELEVATE, porque me obliga a agregar este único grupo. Sin embargo, si solo es necesario agrupar alguna enumeración o no son distintas, voy con la solución de Wendel, porque es más flexible (pero más propenso a errores)

Tengo una enum ''clase'' llamada Example siguiente manera:

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 importante para mi proyecto, ya que todas las enumeraciones con las que trabajo pertenecen a Example (ya que este es un argumento en un constructor de una clase).

¿Cómo uso la jerarquía de enum / anidamiento para lograr lo siguiente:

  • Un método que verifica si una enum es del grupo A, B o C. Por ejemplo, algo como Example.enumA1.isGroupBelonging(Group.A) o isGroupBelonging(Example.enumA1,Group.A) sería un método público que devuelve true .

  • Ser capaz de hacer lo mismo con los subgrupos de los grupos A , B y C Por ejemplo, el grupo A puede tener subgrupos a , b c . Luego quiero un método que haga algo como Example.enumA1.isSubGroupBelonging(SubGroup.a) que es un public boolean .

  • Una forma de hacer todo esto sin necesidad de tener un nombre enum que obstruya mi código. Por ejemplo, sería bueno poder referirse a Example.enumA1 todas mis otras clases sin necesidad de referirme a él utilizando algo como Example.enumA1(Group.A,SubGroup.a) o Example.enumA1.Group.A.SubGroup.a


Puede usar EnumSet para agrupar varias enumeraciones sin crear una clase Enum separada:

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


Usaría un constructor de enumeración muy simple que asocia el grupo correspondiente con el valor de enumeración:

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

Uso:

import static Example.*; import Example.Group; ... ENUM_A1.isInGroup(Group.A); // true ENUM_A1.isInGroup(Group.B); // false

Para hacer los subgrupos, puede hacer un tipo de estructura similar para Grupo como para el Ejemplo, usando Group(SubGroup ... subgroups) como constructor y un EnumSet<SubGroup> para contener los subgrupos.