2012-12-01 4 views
5

Qual è la differenza tra:Inizializzatori statici?

private static Object myVar = new Object(); 

E:

private static Object myVar2; 

static{ 
    myVar2 = new Object(); 
} 

In entrambi i casi io alla fine con un initilized statico variabile

+6

Uno è meno dettagliato dell'altro. Usa il secondo solo se non puoi usare il primo. –

+0

precisamente nessuna differenza. –

risposta

8

È possibile utilizzare meglio la seconda uno se l'inizializzazione di il tuo oggetto statico e forse anche finale è più complesso.

Es .:

static final MyClass something; 

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

Nel tuo esempio non c'è differenza e il bytecode compilato finirà esattamente o quasi lo stesso. Gli inizializzatori statici sono talvolta utili, ma più spesso utilizzati in modo improprio. Se l'obiettivo è compilare un singolo campo statico, scrivere un metodo statico che restituisce l'oggetto inizializzato e chiama tale metodo all'interno della dichiarazione di campo statico.

1

È possibile utilizzare il blocco di inizializzazione statico se la creazione dell'oggetto statico è più complicata. Ad esempio, potrebbe richiedere la chiamata di setter o di un oggetto intermedio secondario impostato.

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

Entrambi sono esattamente come evidente dal contenuto del file di classe:

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 

} 

Si otterrà lo stesso bytecode in entrambi i casi. Ho generato il codice bytecode mettendo sopra le opzioni nel file Test.java.