FindBugs:类中的静态实例初始化

时间:2016-06-21 20:02:56

标签: java static findbugs

FindBugs在我的代码中报告了一个不好的做法, findbugs:SI_INSTANCE_BEFORE_FINALS_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中的静态变量用作不良做法,但实际上没有看到问题。

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

1 个答案:

答案 0 :(得分:1)

可以在构造函数中引用DEFAULT,或者由构造函数直接或间接调用的方法。如果您这样做,其值将为null,这可能会对您最终分配给DEFAULT的实例的初始化产生不良后果。

你不能以这种方式提及它,所以这里真的不是问题 - 目前。但是,将来可以更改课程以便意外地引用它。

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