2012-12-01 95 views
5

之間有什麼區別:靜態初始器?

private static Object myVar = new Object(); 

和:

private static Object myVar2; 

static{ 
    myVar2 = new Object(); 
} 

在這兩種情況下,我最終的initilized靜態變量

+6

其中一個不比另一個冗長。只有在不能使用第一個時才使用第二個。 –

+0

恰恰沒有區別。 –

回答

8

您可以用更好的第二個,如果初始化的你的靜態,也許最終的對象更復雜。

例如爲:

static final MyClass something; 

static { 
    Config conf=SettingsManager.getSettings(); 
    MyClass obj=MyClassFactory.getInstance(conf); 
    obj.setVodoo(true); 
    something=obj; 
} 
6

在您的例子有沒有差異,編譯字節碼將準確或非常接近相同的結束。靜態初始化器有時很有用,但更多時候會被濫用。如果目標是填充單個靜態字段,請編寫一個靜態方法,該方法返回初始化對象並在靜態字段聲明內調用該方法。

1

如果創建靜態對象更復雜,則可以使用靜態初始化塊。例如,它可能需要呼叫建立者,或者設置輔助中間對象。

static { 
    SomeConfig config = new SomeConfig(); 
    config.setMaxSize(10); 
    config.setMinSize(1); 
    YourObject object = new YourObject(config); 
} 
0

,兩者都是顯着的:類文件的內容完全相同:

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文件中添加上述選項來生成字節碼。