Java枚举实例的生命周期

Dus*_*yte 5 java enums

据我所知,每个枚举类型的预定义常量只有一个实例.那是对的吗?现在,假设有一个名为valueenum 的实例变量,假设ONE是一个预定义的常量.如果value为(的)实例修改了,ONE则会影响所有引用的变量ONE.但是什么value时候垃圾收集器摆脱枚举的所有实例的价值呢?他们甚至被扔掉了吗?

下面是一个简单的例子,其中有两个变量AB,既指ONE.在第一次使用value之前,该值被否定B.如果垃圾收集器已经摆脱了该ONE行之前的实例Number B = Number.ONE;,那么value我认为该值将被"重置"回到1.它是否正确?

枚举:

public enum Number
{
    ONE(1), TWO(2), THREE(3); 

    int value;

    Number(int value) { this.value = value; }

    void negate() { value = -value; }

    @Override
    public String toString() { return "value: " + value; }
}
Run Code Online (Sandbox Code Playgroud)

主要方法:

public static void main(String[] args)
{
    Number A = Number.ONE;
    A.negate();
    Number B = Number.ONE;

    System.out.println(A + "   " + B);
}
Run Code Online (Sandbox Code Playgroud)

输出:

值:-1值:-1

所以我的问题是,输出可以是以下(如果说A = null;之前添加B使用)?

值:-1值:1

Dra*_*vic 5

枚举是隐式public static final字段,因此它们永远不会被垃圾收集。

编辑

正如@RealSkeptic 在评论中友好指出的那样,在具有多个类加载器的 jvm 实例中,事情会稍微复杂一些。然后当它们的类被卸载时,静态字段值可能会消失。

但是,默认情况下,只要 jvm 实例处于活动状态,就只有一个处于活动状态的类加载器,因此在您的示例应用程序中,永远不会发生静态字段被垃圾收集的情况。