Tengo una enum ‘clase’ llamado Example de la 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 en el que todas las enumeraciones yo trabajo con pertenecer a Example (ya que este es un argumento en el constructor de una clase).

¿Cómo puedo usar enum a la jerarquía de anidación con el fin de lograr los siguientes:

  • Un método que comprueba si un 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 sub-grupos de grupo de A, B y C. Por ejemplo, Un grupo podría haber subgrupos a, b y c. A continuación, deseo un método que hace algo como Example.enumA1.isSubGroupBelonging(SubGroup.a) que es un public boolean.

  • Una manera de hacer todo esto sin necesidad de tener algún elaborado enum nombre que obstruye mi código. Por ejemplo, sería agradable ser capaz de referirse a Example.enumA1 lo largo de mis otras clases sin necesidad de referirse a ella con algo como Example.enumA1(Group.A,SubGroup.a) o Example.enumA1.Group.A.SubGroup.a

InformationsquelleAutor user2763361 | 2013-10-30

3 Comentarios

  1. 39

    Yo uso una muy simple constructor de la enumeración que se 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 que puede hacer un tipo similar de la estructura de Grupo como por Ejemplo, el uso de Group(SubGroup ... subgroups) como un constructor y un EnumSet<SubGroup> para contener los subgrupos.

    • Excelente solución! También me gustaría añadir getGroup() método para obtener el grupo actual.
    • Solución muy elegante 🙂 gracias!
  2. 27

    Puede utilizar EnumSet para agrupar varias enumeraciones sin crear una sala Enum clase:

    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");
        }
    }
    • También se ve aquí
    • es no garantiza el orden en EnumSet? por ejemplo yo quiero enumeraciones para groupA en el siguiente orden ENUM_A3, ENUM_A1, ENUM_A2.. No sé EnumSet sería garantía de mí el fin de
    • EnumSet no es garantizar el orden, pero se puede usar de las ‘Colecciones.sort(new ArrayList(por Ejemplo.groupA))’ a pedido!
    • Que no hacer nada, como que no tiene acceso a la lista.
  3. 0

    Pequeña adición:

    Me gustan tanto las respuestas de @ELEVAR y @Wendel. Y depende (como siempre) en el escenario cuando el uso de la solución.
    Si cada entrada debe ser parte de un solo grupo prefiero ELEVAR la solución, porque me obliga a añadir este grupo. Sin embargo, si sólo algunos de enumeración deben ser agrupados o no son distintas voy con Wendel la solución, porque es más flexible (pero más propensas a errores)

Dejar respuesta

Please enter your comment!
Please enter your name here