不带索引的 Java 枚举选项



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

这是我的第一次尝试:

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 是越界的。
  • 由于存在很多问题:这甚至有用吗?

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

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

必须预定义值。您的示例尝试执行设置值运行时。在您的情况下,最好使用 classes 而不是 enums .工厂可能会在这里提供帮助。

删除自定义,改用保存自定义值的单独类。然后添加一个由自定义类和 Enum 类实现的通用接口。例如:

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

最新更新