如何在类初始化之前避免因访问静态字段而产生的问题?

cod*_*ker 8 java static classloader

我有这个代码:

public abstract class Person {

    public static final class Guy extends Person {

        public static final Guy TOM = new Guy();
        public static final Guy DICK = new Guy();   
        public static final Guy HARRY = new Guy();
    }

    public static final List<Guy> GUYS = ImmutableList.of(Guy.TOM, Guy.DICK, Guy.HARRY);
}
Run Code Online (Sandbox Code Playgroud)

我知道,看起来它应该是一个枚举,它会是,但它需要继承自Person,一个抽象类.

我的问题是:如果我试图访问Guys列表,我没关系.但是我尝试特别访问任何一个Guy,我有一个问题:Guy之前加载Person.但是,由于Guy继承Person,Person加载和尝试访问TOM,但由于Guy已经加载,因此无法再次开始加载,因此我们有一个空引用.(并且ImmutableList不接受null,所以我们得到一个例外.)

所以我知道为什么会这样,但我不知道如何避免它.我可以将List移动​​到Guy类中,但是我将有多个实现Person,并且我想拥有类中所有Persons 的主列表Person.

我觉得很有可能加载静态内部类而不加载它的包含类,但我想这是有道理的.有什么方法可以解决这个问题吗?

Dmi*_*yev 3

您可以将不可变列表保存在单独的类中,例如People.GUYS

public class People {
    public static final List<Guy> GUYS = ImmutableList.of(Guy.TOM, Guy.DICK, Guy.HARRY);
}
Run Code Online (Sandbox Code Playgroud)

这样你仍然可以将个别的人保留在班级中Guy

public abstract class Person {

    public static final class Guy extends Person {

        public static final Guy TOM = new Guy();
        public static final Guy DICK = new Guy();   
        public static final Guy HARRY = new Guy();
    }
}
Run Code Online (Sandbox Code Playgroud)