如何禁用某些枚举并保持枚举值?

时间:2016-06-06 08:35:44

标签: 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 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;
        }
    }
}

在新版本中,我将禁用选项ONE和TWO

    public enum Num {
        ZERO,
        //ONE,
        //TWO,
        THREE
    }

禁用选项后如何保留正确的值?

4 个答案:

答案 0 :(得分:2)

目前尚不清楚你在问什么。如果您更改任何代码,从而删除" "名称"以前存在...当然,任何"参考"任何被删除的元素是...首先:破碎。

如果是枚举,您可能更愿意依赖内置序数;相反,你可以这样做:

enum Whatever {
   ONE(1), TWO(2);

   private final int value;

   private Whatever(value) {
      this.value = value;
   }

   public int getValue() { return value }

但你必须在这里非常小心。例如,如果您持久化枚举对象(例如某种数据库),那么任何此类更改(添加或删除枚举"值")都将导致不兼容!

答案 1 :(得分:1)

我不确定你想做什么,但例如你可以这样做:

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;

答案 2 :(得分:0)

你现在可能会禁用某些enum并保持原样存储。为了支持这两个方面,你应该有一个方法来返回将在UI上填充的枚举列表。 I.E.列出getPopulatedOnUi()。那包含你需要的枚举列表。 不要从定义本身中删除。保持原样。因为它会为现有产生错误,因为它可能存储在数据库中。

答案 3 :(得分:0)

您可以修改print()方法,如下所示:您可以使用 for loop 代替 switch ,并使代码略显通用。现在,即使您的枚举值发生变化,也无需对此代码进行任何更改。

它会处理这种情况,如果你以后禁用某些枚举值。

    public void print(Num num) {
        for(Num n : Num.values()) {
            if(n == num) {
                System.out.println(n.name()+ " is " + n.ordinal());
                break;
            }
        }

    }