2012-12-01 14 views
5

Was ist der Unterschied zwischen ist:Statische Initialisierer?

private static Object myVar = new Object(); 

Und:

private static Object myVar2; 

static{ 
    myVar2 = new Object(); 
} 

i mit einer initilized statischen Variablen

+6

Einer ist weniger ausführlich als der andere. Verwenden Sie die zweite nur, wenn Sie die erste nicht verwenden können. –

+0

genau kein Unterschied. –

Antwort

8

Sie können besser nutzen die zweite, wenn die Initialisierung am Ende in beiden Fällen von Ihr statisches und vielleicht auch endgültiges Objekt ist komplexer.

Z. B .:

static final MyClass something; 

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

In Ihrem Beispiel gibt es keinen Unterschied und die kompilierte Bytecode genau oder fast die gleiche Ende. Statische Initialisierer sind manchmal nützlich, werden aber häufiger missbraucht. Wenn das Ziel darin besteht, ein einzelnes statisches Feld zu füllen, schreiben Sie eine statische Methode, die das initialisierte Objekt zurückgibt und diese Methode in der statischen Felddeklaration aufruft.

1

Sie können den statischen Initialisierungsblock verwenden, wenn das Erstellen Ihres statischen Objekts komplizierter ist. Zum Beispiel kann es erforderlich sein, Setter aufzurufen oder ein sekundäres Zwischenobjekt einzurichten.

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

Beide sind genau die gleichen wie offensichtlich durch den Inhalt der Klassendatei:

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 

} 

Sie erhalten die gleiche Bytecode in jedem Fall erhalten. Ich habe Bytecode generiert, indem ich die obigen Optionen in die Datei Test.java gesetzt habe.

Verwandte Themen