2012-12-01 70 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文件中添加上述选项来生成字节码。