Java: quando è utile un blocco di inizializzazione statico?

Qual è la differenza tra l’inizializzazione all’interno di un blocco static :

 public class staticTest { static String s; static int n; static double d; static { s = "I'm static"; n = 500; d = 4000.0001; } ... 

E inizializzazione statica individuale:

 public class staticTest { static String s = "I'm static"; static int n = 500; static double d = 4000.0001; .... 

Un blocco di inizializzazione statico consente un’inizializzazione più complessa, ad esempio utilizzando i condizionali:

 static double a; static { if (SomeCondition) { a = 0; } else { a = 1; } } 

O quando è richiesto più di una semplice costruzione: quando si usa un builder per creare l’istanza, è necessaria la gestione delle eccezioni o altro rispetto alla creazione di campi statici.

Un blocco di inizializzazione statico viene eseguito anche dopo gli inizializzatori statici incorporati, pertanto quanto segue è valido:

 static double a; static double b = 1; static { a = b * 4; // Evaluates to 4 } 

Un uso tipico:

 private final static Set SET = new HashSet(); static { SET.add("value1"); SET.add("value2"); SET.add("value3"); } 

Come faresti senza inizializzatore statico?

La gestione delle eccezioni durante l’inizializzazione è un’altra ragione. Per esempio:

 static URL url; static { try { url = new URL("https://blahblah.com"); } catch (MalformsdURLException mue) { //log exception or handle otherwise } } 

Ciò è utile per i costruttori che infastidiscono fastidiosamente le eccezioni controllate, come sopra, o la logica di inizializzazione più complessa che potrebbe essere soggetta ad eccezioni.

Nel tuo esempio, non c’è differenza; ma spesso il valore iniziale è più complesso di quanto sia comodamente express in una singola espressione (ad esempio, è un List cui contenuto è meglio express da un for -loop, oppure è un Method che potrebbe non esistere, quindi i gestori di eccezioni sono necessario) e / o i campi statici devono essere impostati in un ordine specifico.

A volte vuoi fare di più che semplicemente assegnare valori a variabili statiche. Poiché non è ansible inserire istruzioni arbitrarie nel corpo della class, è ansible utilizzare un blocco di inizializzazione statico.

static blocco static può essere utilizzato per inizializzare l’istanza Singleton , per impedire l’uso del metodo getInstance() sincronizzato .

Tecnicamente, potresti andartene senza. Alcuni preferiscono il codice di inizializzazione multilinea per passare a un metodo statico. Sono abbastanza contento di usare un inizializzatore statico per un’inizializzazione a più fasi relativamente semplice.

Certo, quasi sempre renderei i miei statici final e punterei a un object non modificabile.

La parola chiave statica (che si tratti di una variabile o di un blocco) appartiene alla class. Quindi, quando viene chiamata la class, vengono eseguite queste variabili o blocchi. Quindi la maggior parte dell’inizializzazione verrà eseguita con l’aiuto della parola chiave static. Poiché appartiene alla class stessa, la class può accedervi direttamente, senza creare un’istanza della class.

Facciamo un esempio, C’è una class di scarpe in cui ci sono diverse variabili come colore, dimensione, marca ecc … E qui se l’azienda produttrice di scarpe ha una sola marca di quella che dovremmo inizializzare come variabile statica. Quindi, quando viene chiamata la class della scarpa e vengono prodotti diversi tipi di scarpe (creando un’istanza della class) in quel momento il colore e le dimensioni occuperanno memoria ogni volta che viene creata una nuova scarpa, ma qui il marchio è una proprietà comune per tutte le scarpe, in modo che occupi la memoria per una volta, indipendentemente dal numero di scarpe prodotte.

Esempio:

  class Shoe { int size; String colour; static String brand = "Nike"; public Shoe(int size, String colour) { super(); this.size = size; this.colour = colour; } void displayShoe() { System.out.printf("%-2d %-8s %s %n",size,colour, brand); } public static void main(String args[]) { Shoe s1 = new Shoe(7, "Blue"); Shoe s2 = new Shoe(8, "White"); System.out.println("================="); s1.displayShoe(); s2.displayShoe(); System.out.println("================="); } } 

Puoi usare try / catch block all’interno di static{} come di seguito:

 MyCode{ static Scanner input = new Scanner(System.in); static boolean flag = true; static int B = input.nextInt(); static int H = input.nextInt(); static{ try{ if(B <= 0 || H <= 0){ flag = false; throw new Exception("Breadth and height must be positive"); } }catch(Exception e){ System.out.println(e); } } } 

PS: Riferito da questo !

Il blocco di codice statico consente di inizializzare i campi con più di istuzioni, inizializzare i campi in un ordine diverso delle dichiarazioni e potrebbe anche essere utilizzato per l’intializzazione condizionale.

Più specificamente,

 static final String ab = a+b; static final String a = "Hello,"; static final String b = ", world"; 

non funzionerà perché aeb sono dichiarati dopo ab.

Comunque potrei usare un init statico. blocco per superare questo.

 static final String ab; static final String a; static final String b; static { b = ", world"; a = "Hello"; ab = a + b; } static final String ab; static final String a; static final String b; static { b = (...) ? ", world" : ", universe"; a = "Hello"; ab = a + b; } 

Un blocco di inizializzazione statico è utile se si desidera inizializzare i tipi statici di class specificati, prima del primo utilizzo della class. Uso successivo, non invocherà blocchi di inizializzazione statici. È l’esatto opposto degli inizializzatori di istanza, che inizializzano i membri dell’istanza,

Utilizziamo i costruttori per inizializzare le nostre variabili di istanza (variabili non statiche, variabili che appartengono agli oggetti, non alla class).

Se vuoi inizializzare le variabili di class (variabili statiche) e vuoi farlo senza creare un object (i costruttori possono essere chiamati solo quando si crea un object), allora hai bisogno di blocchi statici.

 static Scanner input = new Scanner(System.in); static int widht; static int height; static { widht = input.nextInt(); input.nextLine(); height = input.nextInt(); input.close(); if ((widht < 0) || (height < 0)) { System.out.println("java.lang.Exception: Width and height must be positive"); } else { System.out.println("widht * height"); } }