枚举设置为null后,为什么会保留此值

0 java enums

尝试创建标志枚举时,让它包含多个状态.我注意到一些奇怪的事情.更改枚举的内部值时,其名称不会更改.奇怪的是,这个内部值(在我的情况下是一个int)保持最高值,直到我明确地将值设置为0.

这是我用来进一步测试它的枚举

public enum flags {
   None(0), flag1(1 << 0);

   private int value;

   private flags(int value) {
       this.value = value;
   }

   public boolean hasFlag(flags flag) {
       return (flag.value & value) == flag.value;
   }

   public void addFlag(flags flag) {
       value |= flag.value;
   }

   public int getValue() {
       return value;
   }

   public void setValue(int value) {
      this.value = value;
   }
}
Run Code Online (Sandbox Code Playgroud)

我试过这些东西将枚举值设置为0

    flags flag = flags.None;
    System.out.println(flag + " " + flag.getValue());
    // prints: None 0

    flag.addFlag(flags.flag1);
    System.out.println(flag + " " + flag.getValue());
    // prints: None 1

    flag = flags.None;
    System.out.println(flag + " " + flag.getValue());
    // prints: None 1 even though
    // its been set to flags.None which has a value of 0

    flag = null;
    flag = flags.None;
    System.out.println(flag + " " + flag.getValue());
    // prints: None 1. Even though the enum has been set to null before
    // setting the value to null

    flag = null;
    flag = flags.flag1;
    flag = flags.None;
    System.out.println(flag + " " + flag.getValue());
    // prints: None 1. Even though it is set to
    // another value after being set to null
    // and then set to None

    flag.setValue(0);
    System.out.println(flag + " " + flag.getValue());
    // prints: None 0. As expected
Run Code Online (Sandbox Code Playgroud)

我的问题如下:为什么价值如此持久,这里发生了什么?

nas*_*kin 5

我认为你严重误解了Java枚举的目的和功能.根据定义,枚举是单例,这意味着枚举的每个定义都是每个运行时构造一次且只构造一次.换句话说,你不能有两个flags.None实例; flags.None在您的应用程序运行时,它永远是一件事.

可以 - 但是 - 声明引用您的枚举的多个字段.就像你可能会说的那样int i = 0,你可以声明一个"flags"变量flags myFlag = flags.None.这不会创建"None"的新版本,但它是对"None"枚举的引用.修改"无"状态(这是一个坏主意恕我直言)将在整个应用程序中全局出现.

此外,你不应该把你自己的点缀在你写的枚举中.我建议你看看EnumSet吗?这将产生更易读的代码,并且是实现您想要实现的目标的有利方式.