Java 如何禁用某些枚举并保留枚举值?
我写了一本图书馆 此库接受有限的选项并打印相关字符串Java 如何禁用某些枚举并保留枚举值?,java,enums,Java,Enums,我写了一本图书馆 此库接受有限的选项并打印相关字符串 public class Lib { public enum Num { ZERO, ONE, TWO, THREE } public static void main(String[] args) { Lib obj = new Lib(); obj.print(Num.ONE); } public
public class Lib {
public enum Num {
ZERO,
ONE,
TWO,
THREE
}
public static void main(String[] args) {
Lib obj = new Lib();
obj.print(Num.ONE);
}
public void print(Num num) {
switch (num) {
case ZERO:
System.out.println("ZERO is "+Num.ZERO.ordinal());
break;
case ONE:
System.out.println("ONE is "+Num.ONE.ordinal());
break;
case TWO:
System.out.println("TWO is "+Num.TWO.ordinal());
break;
case THREE:
System.out.println("THREE is "+Num.THREE.ordinal());
break;
default:
break;
}
}
}
在新版本中,我将禁用选项一和选项二
public enum Num {
ZERO,
//ONE,
//TWO,
THREE
}
禁用选项后,如何保持正确的值?您现在可以禁用部分enum,并保持存储状态。为了支持这两种功能,您应该有一个方法返回将在UI上填充的枚举列表。即,列出getPopulatedOnUi()。包含所需的枚举列表的。
不要从定义本身中删除。保持原样。因为这将导致现有的错误,因为它可能被存储到数据库中。您可能现在就禁用一些enum,并保持存储不变。为了支持这两种功能,您应该有一个方法返回将在UI上填充的枚举列表。即,列出getPopulatedOnUi()。包含所需的枚举列表的。
不要从定义本身中删除。保持原样。因为这将导致现有文件出错,因为它可能存储到数据库中。我不确定您想做什么,但例如,您可以这样做:
public enum Num {
ZERO,
ONE,
TWO,
THREE
}
switch (num) {
case ZERO:
System.out.println("ZERO is "+Num.ZERO.ordinal());
break;
case THREE:
System.out.println("ZERO is "+Num.THREE.ordinal());
break;
case One:
case Two:
default:
break;
我不确定您想做什么,但例如,您可以这样做:
public enum Num {
ZERO,
ONE,
TWO,
THREE
}
switch (num) {
case ZERO:
System.out.println("ZERO is "+Num.ZERO.ordinal());
break;
case THREE:
System.out.println("ZERO is "+Num.THREE.ordinal());
break;
case One:
case Two:
default:
break;
不清楚你在问什么。如果您更改任何代码,从而“删除”以前存在的“名称”。。。当然,对任何被删除元素的任何“引用”都是。。。首先:破碎 对于枚举,您可能希望不依赖内置序号;相反,你可以这样做:
enum Whatever {
ONE(1), TWO(2);
private final int value;
private Whatever(value) {
this.value = value;
}
public int getValue() { return value }
但在这里你必须非常小心。例如,如果要持久化枚举对象(例如,保存到某种数据库中),则任何此类更改(添加或删除枚举“值”)都将导致不兼容 不清楚你在问什么。如果您更改任何代码,从而“删除”以前存在的“名称”。。。当然,对任何被删除元素的任何“引用”都是。。。首先:破碎 对于枚举,您可能希望不依赖内置序号;相反,你可以这样做:
enum Whatever {
ONE(1), TWO(2);
private final int value;
private Whatever(value) {
this.value = value;
}
public int getValue() { return value }
但在这里你必须非常小心。例如,如果要持久化枚举对象(例如,保存到某种数据库中),则任何此类更改(添加或删除枚举“值”)都将导致不兼容 您可以如下修改print()方法:您可以使用for循环代替switch,并使代码稍微通用一点。现在,即使枚举值发生更改,也不需要在代码中进行任何更改
如果将来禁用某些枚举值,它将处理这种情况
public void print(Num num) {
for(Num n : Num.values()) {
if(n == num) {
System.out.println(n.name()+ " is " + n.ordinal());
break;
}
}
}
您可以按如下方式修改print()方法:您可以使用for循环代替switch,并使代码稍微通用一点。现在,即使枚举值发生更改,也不需要在代码中进行任何更改
如果将来禁用某些枚举值,它将处理这种情况
public void print(Num num) {
for(Num n : Num.values()) {
if(n == num) {
System.out.println(n.name()+ " is " + n.ordinal());
break;
}
}
}
禁用枚举是什么意思?你想达到什么目的?不要使用
ordinal()
方法。定义您自己的字段和方法。因为枚举中只剩下2个值,ordinal()
打印其他数字,这就是您的意思?禁用枚举是什么意思?你想达到什么目的?不要使用ordinal()
方法。定义您自己的字段和方法。因为枚举中只剩下2个值,ordinal()
打印其他数字,这就是您的意思?这就是为什么我需要保留旧值的原因,如果“三”从“3”更改为“1”,根据我的经验,它与数据库中现有的数据不一致:枚举和数据库并不是很好的组合。如果可能的话,远离这种组合。但你的问题可能表明你“太”晚了。这就是为什么我需要保留旧值的原因,如果“三”从“3”更改为“1”,它与数据库中的现有数据不一致根据我的经验:枚举和数据库并不是很好的组合。如果可能的话,远离这种组合。但你的问题可能表明你已经“太”晚了。