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.
我觉得很有可能加载静态内部类而不加载它的包含类,但我想这是有道理的.有什么方法可以解决这个问题吗?
您可以将不可变列表保存在单独的类中,例如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)