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”,它与数据库中的现有数据不一致根据我的经验:枚举和数据库并不是很好的组合。如果可能的话,远离这种组合。但你的问题可能表明你已经“太”晚了。