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
中的静态变量用作不良做法,但实际上没有看到问题。
任何人都可以解释为什么这是不好的做法,使用这种不良做法可能会发生什么样的意外行为,并提出更好的做法作为替代方案?
答案 0 :(得分:1)
你可以在构造函数中引用DEFAULT
,或者由构造函数直接或间接调用的方法。如果您这样做,其值将为null
,这可能会对您最终分配给DEFAULT
的实例的初始化产生不良后果。
你不能以这种方式提及它,所以这里真的不是问题 - 目前。但是,将来可以更改课程以便意外地引用它。
在您的示例代码中,它看起来像一个非常便宜的实例化类。您可以简单地提供静态工厂方法getDefault()
,以便在需要时创建新实例。如果它实际上并不那么便宜,你可以使用某种形式的延迟初始化。