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我有其他与此枚举相关的参数定义,即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.

关键是要集中这些参数,以便我可以对它们执行“通用验证”。

4

1 回答 1

0

您可以在同一个枚举中引用其他枚举常量。例如,您可以在 ADDPERSON 或 DELETEPERSON 中维护一组参数,并使用参数()等方法调用来查找它们;

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

}
于 2013-09-18T20:35:19.923 回答