我有一个看起来与此类似的类,而findbugz抱怨'从实例方法写入静态字段'(initialize()
和killStaticfield()
)。我无法在ctor中设置静态字段。
将staticField置于AtomicReference中是否足够?
public class Something
{
private static SomeClass staticField = null;
private AnotherClass aClass;
public Something()
{
}
public void initialize()
{
//must be ctor'd in initialize
aClass = new AnotherClass();
staticField = new SomeClass( aClass );
}
public void killStaticField()
{
staticField = null;
}
public static void getStaticField()
{
return staticField;
}
}
答案 0 :(得分:16)
尽可能接近原始设计......
public class Something {
private static volatile SomeClass staticField = null;
public Something() {
}
public static SomeClass getStaticField() {
if(Something.staticField == null)
Something.staticField = new SomeClass();;
return Something.staticField;
}
}
通过类名引用静态变量,这将删除findbugz警告。 将静态变量标记为volatile,这将使参考在多线程环境中更安全。
更好的是:
public class Something {
private static final SomeClass staticField = new SomeClass();
public Something() {
}
public static SomeClass getStaticField() {
return Something.staticField;
}
}
答案 1 :(得分:4)
问题是你想用静态字段做什么。如果它对你创建的每个类都有所改变,那么将它静态化可能不是一个好主意。如果它只被初始化一次你应该懒得将其初始化为单身。
public class Something
{
private static SomeClass staticField = null;
public Something()
{
}
public static SomeClass getStaticField()
{
if(staticField == null)
staticField = new SomeClass();;
return staticField;
}
}
答案 2 :(得分:4)
如果static不是静态的,请从staticField中删除静态。
自己制作kill和getStaticField。并且你通常通过类名引用静态,而不是通过(隐式)引用静态,以明确它是静态的并且可能在其他thReads中引起意外后果。
如有疑问,请勿对非常数字段使用静态。
答案 3 :(得分:0)
最好的方法是不要这样做,尝试找到更好的设计模式。 如果确实有必要,这将起作用,并且不会使findbug / spotbug抱怨。
public class Something
{
private static SomeClass staticField = null;
public Something()
{
}
private void setStaticField(SomeClass value){
staticField=value;
}
public static SomeClass getStaticField()
{
if(staticField == null)
setStaticField(new SomeClass());
return staticField;
}
}