これに似たクラスがあり、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;
}
}
元のデザインにできるだけ近づける...
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警告が削除されます。静的変数を揮発性としてマークします。これにより、マルチスレッド環境で参照がより安全になります。
さらに良いのは:
public class Something {
private static final SomeClass staticField = new SomeClass();
public Something() {
}
public static SomeClass getStaticField() {
return Something.staticField;
}
}
問題は、静的フィールドで何をしたいのかということです。作成するクラスごとに変更される場合は、静的にすることはお勧めできません。一度だけ初期化される場合は、シングルトンとして遅延初期化する必要があります。
public class Something
{
private static SomeClass staticField = null;
public Something()
{
}
public static SomeClass getStaticField()
{
if(staticField == null)
staticField = new SomeClass();;
return staticField;
}
}
静的であってはならない場合は、staticFieldからstaticを削除します。
KillとgetStaticFieldを静的にします。また、静的を(暗黙の)thisではなくクラス名で参照して、静的であり、他のthReadで予期しない結果を引き起こす可能性があることを明確にします。
疑わしい場合は、非定数フィールドに統計を使用しないでください。