FindBugs:class 内的静态实例初始化

FindBugs: static instance initialization within class

FindBugs 报告了我的代码中的错误做法, findbugs:SI_INSTANCE_BEFORE_FINALS_ASSIGNED.

The class's static initializer creates an instance of the class before all of the static final fields are assigned.

我的代码看起来像..

public class Foo {

    public static final Foo DEFAULT = new Foo(Bar.A, "baz");

    public enum Bar {
        A, B
    }

    private final Bar bar;
    private final String baz;

    public Foo(Bar bar, String baz) {
        this.bar = bar;
        this.baz = baz;
    }

}

我知道它将 new Foo 的使用标记为 Foo 中的静态变量是一种不好的做法,但并没有真正看出问题所在。

谁能解释为什么这是不好的做法,使用这种不好的做法可能会发生什么意外行为,并可能提出更好的做法作为替代方案?

可以在构造函数中引用DEFAULT,或者构造函数直接或间接调用的方法。如果这样做,它的值将是 null,这可能会对您最终分配给 DEFAULT.

的实例的初始化产生不良后果

您不会以这种方式引用它,因此目前这并不是真正的问题。但是,class 将来可能会更改为意外引用它。

在您的示例代码中,实例化看起来非常廉价 class。您可以简单地提供一个静态工厂方法 getDefault(),以便在需要时创建一个新实例。如果它实际上并不那么便宜,您可以采用某种形式的惰性初始化。