没有索引的java enum选项

时间:2016-05-21 06:59:14

标签: java enums enumerator

我想定义一个可以接受特定值的枚举器,但也提供类似default的选项 - 名为CUSTOM的选项,我可以使用该选项将枚举数的索引设置为任何整数。

这是我的第一次尝试:

public enum EnumClass {
    CUSTOM(),
    NONE(0),
    OPTION1(-1),
    OPTION2(-2);

    private int value;
    private EnumClass (int value) { this.value = value; }
    private EnumClass () {}
    public static EnumClass Custom(int value) {
        if (-2 <= value && value <= 0) return EnumClass.valueOf(value);
        EnumClass result = EnumClass.CUSTOM;
        result.value = value;
        return result;
    }

    public int getValue() { return value; }
}

我对这个解决方案的问题是:

  • value通常为final,但我必须不是最终才能使CUSTOM选项有效。
  • 每当我尝试使用-5或甚至-2的值创建EnumClass实例时,我都会收到运行时错误。 (显然我的编译器变得疯狂,因为在我尝试输入-5后我尝试了-2但它仍然告诉我-5是超出界限。)
  • 因为有很多问题:这是否是有用的概念?

2 个答案:

答案 0 :(得分:2)

我不认为在这种情况下使用enum是正确的。如果你看一下oracle文档:https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

  

枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量。

值必须预定义。您的示例尝试执行设置值运行时。在您的情况下,最好使用classes代替enums。工厂可能会帮到这里。

答案 1 :(得分:0)

删除CUSTOM,而是使用包含自定义值的单独类。然后添加一个您的Custom类和Enum类实现的通用接口。 E.g:

public static void main(String[] args) {
    HasValue hv = HasValue.get(-2);
    System.out.println(hv);
}

public interface HasValue {
    static HasValue get(int value) {
        for (EnumClass el : EnumClass.values()) {
            if (el.value == value) {
                return el;
            }
        }

        return new Custom(value);
    }

    int value();

    class Custom implements HasValue {
        private final int value;

        Custom(int value) {
            this.value = value;
        }

        @Override
        public int value() {
            return value;
        }
    }

    enum EnumClass implements HasValue {
        NONE(0),
        OPTION1(-1),
        OPTION2(-2);

        private final Integer value;

        private EnumClass (int value) {
            this.value = value;
        }

        private EnumClass () {
            value = null;
        }

        @Override
        public int value() {
            return value;
        }
    }
}