【问题标题】:java enum option without index没有索引的java枚举选项
【发布时间】:2016-05-21 06:59:13
【问题描述】:

我想定义一个枚举器,它可以接受特定的值,但也提供类似 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 超出范围。)
  • 问题太多了:这个概念有用吗?

【问题讨论】:

  • EnumClass.CUSTOM 只有一个实例,因此每次调用Custom(int value) 时,所有现有引用的值都会发生变化。我不认为这是你想要的。您似乎在要求一个动态可更新的枚举,它在 Java 中不存在。您当然可以从头开始编写自己的课程来做到这一点。
  • 您不能创建枚举值的新实例。枚举非常固定,例如您的示例恰好有 4 个实例,并且在运行时无法更改。如果您需要添加额外的实例,请使用常规类。

标签: java enums enumerator


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    删除 CUSTOM 并改为使用包含自定义值的单独类。然后添加自定义类和枚举类都实现的通用接口。例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多