Intellij检查工具警告在静态变量中引用子类并不是一个好习惯,因为它可能导致死锁。使用以下文本:
此检查报告引用其自己的子类的类 他们的静态初始化器或静态字段。这样的参考可以 在多线程环境中导致JVM级别的死锁 线程尝试加载超类,另一个线程尝试加载 同时是一个子类。
以下示例说明:
class Generator {
public static Generator fiveGenerator = new FixedGenerator(5);
public static Generator sixGenerator = new FixedGenerator(6);
int generateNumber() {
//some generation code
}
private class FixedGenerator extends Generator {
FixedGenerator(int num) {
this.num = num;
}
@Override
int generate() {
return this.num;
}
}
}
请注意:
FixedGenerator
上课是并且应该是私人的。
fiveGenerator
和sixGenerator
是公开的。
关于我,我有两个问题:
这是一种不好的做法吗?为什么?怎么会造成这种僵局?
等效代码的正确方法是什么?
答案 0 :(得分:0)
此代码不会导致任何死锁
死锁与并发性有关,你不具备并发性
你可能有一个初始化问题,但是你不会因为FixedGenerator()
调用Generator()
但Generator()
没有调整而没有周期调用FixedGenerator()
。
这是一种不好的做法吗?
因为类不应该引用/知道它们的子类。
等效代码的正确方法是什么?
你可以避免在私人班级中继承 作为替代方案,您可以支持组合而不是继承。