我想定义一个可以接受特定值的枚举器,但也提供类似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
选项有效。答案 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;
}
}
}