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()
,以便在需要时创建一个新实例。如果它实际上并不那么便宜,您可以采用某种形式的惰性初始化。
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()
,以便在需要时创建一个新实例。如果它实际上并不那么便宜,您可以采用某种形式的惰性初始化。