我想定义一个枚举器,它可以接受特定值,但也提供了一个名为CUSTOM
的default
-选项,我可以使用它将枚举器的索引设置为任何整数。
这是我的第一次尝试:
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;
}
}
}