- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我知道枚举类型的每个预定义常量都有一个实例。是这样吗?现在,假设枚举有一个名为 value
的实例变量,并且假设 ONE
是一个预定义常量。如果为 ONE
的实例修改了 value
,那么这会影响引用 ONE
的所有变量。但是,当垃圾收集器清除枚举的所有实例时,value
的值会发生什么变化?他们甚至被扔掉了吗?
示例
这是一个简单的例子,其中有两个变量 A
和 B
,都指向 ONE
。 value
的值在B
第一次使用前被取反。如果垃圾收集器在 Number B = Number.ONE;
行之前清除了 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; }
}
主要方法:
public static void main(String[] args)
{
Number A = Number.ONE;
A.negate();
Number B = Number.ONE;
System.out.println(A + " " + B);
}
输出:
value: -1 value: -1
所以我的问题是,输出是否可以是以下内容(如果在使用 B
之前添加 A = null;
)?
value: -1 value: 1
最佳答案
枚举是隐式的 public static final
字段,因此它们永远不会被垃圾回收。
编辑
正如@RealSkeptic 在评论中友好指出的那样,在具有多个类加载器的 jvm 实例中,事情要复杂一些。那么静态字段值可能会在它们的 classes are unloaded 消失时消失。 .
但是,默认情况下,只要 jvm 实例处于 Activity 状态,就只有一个类加载器处于 Activity 状态,因此在您的示例应用程序中,静态字段永远不会被垃圾回收。
关于java - Java 枚举实例的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31356845/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!