2013-09-18 4 views
0

Мне нужно определить некоторые «метаданные» в перечислении. В принципе, у меня есть несколько параметров, которые присутствуют, когда присутствует какой-либо родительский параметр.Нужны вложенные перечисления для группировки

Например:

enum Param { 
    ADDPERSON("addperson", false), 
    DELETEPERSON("deleteperson", false); 

    String name; 
    boolean required; 

    private Param(String name, boolean required) { 
     this.name = name; 
     this.required = required; 
    } 

    public String getName() { 
     return this.name; 
    } 
} 

Param.ADDPERSON Теперь у меня есть другие Param определения, связанные с этим перечислений т.е. NAME, EMAIL и т.д.

Идеально было бы, чтобы быть в состоянии назвать Param.ADDPERSON.NAME. Это не представляется возможным, за исключением этого метода обхода с внутренним статическим перечислимого:

enum Param { 
    ADDPERSON("addperson", false), 
    DELETEPERSON("deleteperson", false); 

    String name; 
    boolean required; 

    private Param(String name, boolean required) { 
     this.name = name; 
     this.required = required; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public static enum AddPerson { 
     NAME("name", true), 
     EMAIL("email", true); 

     String name; 
     boolean required; 

     public String getName() { 
      return this.name; 
     } 

     private AddPerson(String name, boolean required) { 
      this.name = name; 
      this.required = required; 
     } 
    } 
} 

Теперь я могу использовать Param.AddPerson.NAME, но это не чистое решение + мне нужно, чтобы быть в состоянии захватить ребенка перечислений, например, получить все дочерние перечисления ADDPERSON.

Цель состоит в том, чтобы эти параметры были централизованы, чтобы я мог выполнять «общую проверку».

ответ

0

Вы можете обратиться к другим константам enum внутри одного и того же перечисления. Например, вы можете поддерживать набор параметров внутри ADDPERSON или DELETEPERSON и искать их с помощью вызова метода, такого как parameters();

public enum Param { 

    NAME("name", true, true, EnumSet.noneOf(Param.class)), 
    EMAIL("email", true, true, EnumSet.noneOf(Param.class)), 
    ADD_PERSON("addperson", false, false, EnumSet.of(NAME, EMAIL)), 
    DELETE_PERSON("deleteperson", false, false, EnumSet.of(NAME)); 

    final String name; 
    final boolean required; 
    final boolean isParameter; 
    final EnumSet<Param> parameters; 

    private Param(
      final String name, 
      final boolean isParameter, 
      final boolean required, 
      final EnumSet<Param> parameters) { 
     this.name = name; 
     this.isParameter = isParameter; 
     this.required = required; 
     this.parameters = parameters; 
    } 

    public Set<Param> parameters() { 
     return EnumSet.copyOf(parameters); 
    } 

    public String getName() { 
     return this.name; 
    } 

} 
Смежные вопросы