違いは何ですか:
private static Object myVar = new Object();
と:
private static Object myVar2;
static{
myVar2 = new Object();
}
どちらの場合も、初期化された静的変数になります
static およびおそらく final オブジェクトの初期化がより複雑な場合は、2 番目のものをより適切に使用できます。
例えば:
static final MyClass something;
static {
Config conf=SettingsManager.getSettings();
MyClass obj=MyClassFactory.getInstance(conf);
obj.setVodoo(true);
something=obj;
}
あなたの例では違いはなく、コンパイルされたバイトコードは正確にまたはほとんど同じになります。静的初期化子は便利な場合もありますが、誤用されることがよくあります。目標が単一の静的フィールドにデータを入力することである場合は、初期化されたオブジェクトを返す静的メソッドを記述し、静的フィールド宣言内でそのメソッドを呼び出します。
静的オブジェクトの作成がより複雑な場合は、静的初期化ブロックを使用できます。たとえば、セッターの呼び出し、またはセットアップ中のセカンダリ中間オブジェクトが必要になる場合があります。
static {
SomeConfig config = new SomeConfig();
config.setMaxSize(10);
config.setMinSize(1);
YourObject object = new YourObject(config);
}
クラスファイルの内容から明らかなように、どちらもまったく同じです。
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
static {};
Code:
0: new #2; //class java/lang/Object
3: dup
4: invokespecial #1; //Method java/lang/Object."<init>":()V
7: putstatic #3; //Field myVar2:Ljava/lang/Object;
10: return
}
どちらの場合も同じバイトコードを取得します。上記のオプションを Test.java ファイルに入れることでバイトコードを生成しました。