在静态变量中引用子类

时间:2018-02-12 20:40:11

标签: java deadlock

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上课是并且应该是私人的。

  • fiveGeneratorsixGenerator是公开的。

关于我,我有两个问题:

  • 这是一种不好的做法吗?为什么?怎么会造成这种僵局?

  • 等效代码的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

此代码不会导致任何死锁 死锁与并发性有关,你不具备并发性 你可能有一个初始化问题,但是你不会因为FixedGenerator()调用Generator()Generator()没有调整而没有周期调用FixedGenerator()

  

这是一种不好的做法吗?

因为类不应该引用/知道它们的子类。

  

等效代码的正确方法是什么?

你可以避免在私人班级中继承 作为替代方案,您可以支持组合而不是继承。