Devo inizializzare un elenco quando lo dichiaro o devo usare un blocco statico?

2

Qualcuno potrebbe spiegare quale dei due frammenti seguenti è la procedura migliore per inizializzare un static final List ?

Inizializza quando dichiari:

public class Sample {

   private static final List<String> myList = Collections.unmodifiableList(Arrays.asList(
            "Cache-Control",
            "Content-Language",
            "Content-Type",
            "Expires",
            "Last-Modified",
            "Pragma"
    ));
}

Inizializza nel blocco statico:

public class Sample {

   private static final List<String> myList;

   static { 
    myList = Collections.unmodifiableList(Arrays.asList(
            "Cache-Control",
            "Content-Language",
            "Content-Type",
            "Expires",
            "Last-Modified",
            "Pragma"
    ));
   }
}
    
posta Diyarbakir 06.04.2016 - 17:18
fonte

4 risposte

9

Inizializza le variabili dove sono dichiarate se possibile. Riduce il carico di memoria sul lettore. "Ah, ecco una lista di ..." in contrasto con "Ecco una lista ... ed ecco l'inizializzazione". Anche se sono adiacenti, l'inizializzazione statica aumenta la quantità di codice da leggere. A poco a poco la verbosità si somma e rende la manutenzione più costosa.

Salva l'inizializzazione statica per i casi in cui è richiesta, ad es. precaricare una mappa.

    
risposta data 06.04.2016 - 18:01
fonte
3

Sto cercando di evitare static blocchi, ove possibile, per i motivi menzionati da kevin cline . Se non è possibile inizializzare il campo con un'espressione semplice, preferisco impostare la logica in un metodo helper private static . È molto chiaro sull'intento, mantiene la dichiarazione dei tuoi campi compatta e funziona quasi in ogni caso che ho visto finora.

private static final Map<Integer, String> daysOfTheWeek = makeDaysOfWeek();

private static Map<Integer, String> makeDaysOfWeek() {
    final Map<Integer, String> days = new TreeMap<>();
    days.put(0, "Monday");
    days.put(1, "Tuesday");
    days.put(2, "Wednesday");
    days.put(3, "Thursday");
    days.put(4, "Friday");
    days.put(5, "Saturday");
    days.put(6, "Sunday");
    return Collections.unmodifiableMap(days);
}
    
risposta data 06.04.2016 - 18:41
fonte
2

Non fa alcuna differenza ed è una questione di preferenze personali.

Detto questo, mi piace la seconda opzione migliore perché l'inizializzazione, non essendo una riga singola, interrompe l'ordine visivo quando ci sono diversi membri.

Ad esempio:

private int foo=0;
private static final List<String> myList;
private int bar=1;
private int baz=3;

static { 
 myList = Collections.unmodifiableList(Arrays.asList(
         "Cache-Control",
         "Content-Language",
         "Content-Type",
         "Expires",
         "Last-Modified",
         "Pragma"
 ));
}

è più ordinato di

private int foo=0;
private static final List<String> myList= Collections.unmodifiableList(Arrays.asList(
                     "Cache-Control",
                     "Content-Language",
                     "Content-Type",
                     "Expires",
                     "Last-Modified",
                     "Pragma"
                 ));
private int bar=1;
private int baz=3;
    
risposta data 06.04.2016 - 17:34
fonte
1

Un punto chiave di questo è che l'elenco è definitivo. Se la tua variabile è definitiva, a meno che non ci siano più metodi statici per l'inizializzazione, devi inizializzarla nello stesso momento in cui la dichiari. Questo limita i costi generali. Entrambe le modalità funzionano, ma in questo caso mantenerla semplice mantiene efficiente la memoria.

    
risposta data 06.04.2016 - 22:20
fonte

Leggi altre domande sui tag