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 comoExample.enumA1.isGroupBelonging(Group.A)
oisGroupBelonging(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
yC
Por ejemplo, el grupo A puede tener subgruposa
,b
c
. Luego quiero un método que haga algo comoExample.enumA1.isSubGroupBelonging(SubGroup.a)
que es unpublic 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 aExample.enumA1
todas mis otras clases sin necesidad de referirme a él utilizando algo comoExample.enumA1(Group.A,SubGroup.a)
oExample.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.