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
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
È 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;
}
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.
È 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);
}
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.
Uno è meno dettagliato dell'altro. Usa il secondo solo se non puoi usare il primo. –
precisamente nessuna differenza. –