java 枚举 排序_Java枚举属性根据访问顺序返回null

小编典典

这与枚举和类初始化有关。

enum SomeEnum {

CONSTANT;

}

编译成类似于

final class SomeEnum extends Enum {

public static final SomeEnum CONSTANT = new SomeEnum();

}

接下来,以文本顺序执行类的类变量初始化器和静态初始化器,或接口的字段初始化器,就好像它们是单个块一样。

在下面的

final class SomeEnum extends Enum {

public static final SomeEnum CONSTANT = new SomeEnum();

public static final SomeEnum CONSTANT_2 = new SomeEnum();

}

CONSTANT将首先被初始化,然后被初始化CONSTANT_2。

第四,如果当前线程正在初始化一个类,则可以正常进行。

如果Class对象C表示C当前线程正在进行初始化,则这必须是对初始化的递归请求。释放LC并正常完成。

这一切如何融合在一起?

这个

ENUM.ANIMALS.CATS.GARFIELD.RIVAL

被评估为

CATS cat = ENUM.ANIMALS.CATS.GARFIELD;

DOGS rvial = cat.RIVAL;

首次访问将GARFIELD强制enum类型的初始化CATS。这开始初始化中的枚举常量CATS。编译后,这些看起来像

private static final CATS FELIX = new CATS(DOGS.AKAME);

private static final CATS GARFIELD = new CATS(DOGS.WEED);

private static final CATS BUBSY = new CATS(DOGS.GIN);

这些按顺序初始化。所以FELIX先去。作为其新实例创建表达式的一部分,它访问DOGS.AKAME,而该类型DOGS尚未初始化,因此Java开始对其进行初始化。该DOGS枚举类型,编译,看起来像

private static final DOGS GIN = new DOGS(CATS.FELIX);

private static final DOGS WEED = new DOGS(CATS.BUBSY);

private static final DOGS AKAME = new DOGS(CATS.GARFIELD);

因此,我们从开始GIN。在其新的实例创建表达式中,它尝试访问CATS.FELIX。CATS当前正在初始化,因此我们继续。CATS.FELIX尚未分配值。目前,它在堆栈中的位置较低。因此其值为null。因此GIN.RIVALS获得对的引用null。同样的情况,给所有DOGS“

RIVAL。

DOGS初始化所有后,执行返回

private static final CATS FELIX = new CATS(DOGS.AKAME);

其中,DOGS.AKAME现指完全初始化DOGS的对象。那被分配给它的CATS#RIVAL领域。每个都相同CATS。换句话说,所有的CATS‘

RIVAL字段都被分配了一个DOGS引用,但是没有相反的方式。

对语句重新排序只是确定enum首先要初始化的类型。

2020-11-26

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值