gpt4 book ai didi

java - FindBugs:类内的静态实例初始化

转载 作者:行者123 更新时间:2023-11-30 10:42:51 25 4
gpt4 key购买 nike

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 的实例的初始化产生不良后果。

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

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

关于java - FindBugs:类内的静态实例初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37953588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com