我有一个类似于这个的类,并且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;
}
}
Run Code Online (Sandbox Code Playgroud)rom*_*afe 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;
}
}
Run Code Online (Sandbox Code Playgroud)
通过类名称引用静态变量,这将删除findbugz警告.将静态变量标记为volatile,这将使多线程环境中的引用更安全.
更好的是:
public class Something {
private static final SomeClass staticField = new SomeClass();
public Something() {
}
public static SomeClass getStaticField() {
return Something.staticField;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是你想用静态字段做什么。如果您创建的每个类都发生变化,那么将其静态化可能根本不是一个好主意。如果它只初始化一次,那么您应该将其延迟初始化为单例。
public class Something
{
private static SomeClass staticField = null;
public Something()
{
}
public static SomeClass getStaticField()
{
if(staticField == null)
staticField = new SomeClass();;
return staticField;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35859 次 |
| 最近记录: |