2012-01-31 19 views
10

Quando dovremmo usare una variabile finale statica non inizializzata? So che una variabile finale statica non inizializzata può essere assegnata solo a valori nel blocco di inizializzazione statico, ma non riesco a pensare a un reale utilizzo per questo.Quando dovremmo usare una variabile finale statica non inizializzata?

+0

forse _never_? –

+0

Cosa intendi per "vuoto"? Intendi una variabile 'static final' inizializzata a' null'? O intendi qualsiasi tipo di variabile 'static final' (' statico finale privato ', 'finale statico pubblico', ecc.)? –

+0

Vuol dire vuoto come in non inizializzato. – fivedigit

risposta

8

suppongo che voi dire:

public static final Object obj; 

con nessun valore iniziale esplicitamente assegnato?

È possibile assegnarlo nel blocco static in base ad alcuni calcoli che possono verificarsi solo in fase di esecuzione, ad esempio la lettura di alcuni file di proprietà per creare una costante a livello di applicazione che non è nota al momento della compilazione.

+0

grazie mille! –

+0

@Tudor, Perché il valore predefinito è 'null'? Questo comportamento è garantito nelle specifiche? Mi sembra che il valore predefinito non sia definito perché non saremmo in grado di leggerlo prima dell'assegnazione in primo luogo (errore del compilatore). – Pacerier

+0

@Pacerier: ben individuato. Sarebbe davvero un errore in fase di compilazione non assegnare un valore a un campo 'finale' e la specifica dice che il default non verrà mai osservato per tali campi. Ho corretto la mia risposta. – Tudor

17

Viene utilizzato quando l'inizializzazione della variabile non può essere eseguita in una singola riga. Ad esempio:

private static final Map<String, String> CACHE; 

static { 
    Map<String, String> cache = new HashMap<String, String>(); 
    cache.put("foo", "bar"); 
    cache.put("zim", "bam"); 
    // lots of other entries 
    CACHE = Collections.unmodifiableMap(cache); 
} 
5

pratica se necessario assegnare un valore che non può essere facilmente rappresentato in una singola espressione. Ad esempio, potresti voler fare un po 'di logica per costruire una mappa immutabile e poi assegnarla.

genere è più leggibile per mettere la logica "edificio" in un metodo statico separata, e l'uso che nell'assegnazione normale però:

private static final Map<String, String> FOO_MAP = buildFooMap(); 
+0

grazie! Mi dà una spiegazione migliore. –

0

Statico + finale

Insomma,

Static - per renderlo il più una variabile di classe - indipendente dall'oggetto (accessibile ad ogni oggetto nella stessa posizione sempre)

Finale - per renderlo costante. (Se finale è prima di una variabile di corso!)

Dove abbiamo bisogno solo statico?

=> Può essere il conteggio del numero di istanze di un oggetto.

Dove abbiamo bisogno solo del finale?

=> Bene, per fare qualcosa di costante!

Dove abbiamo bisogno di statico + finale?

=> Rende la variabile accessibile a ogni oggetto e per creare una costante.Come può essere la creazione di una classe per COLOR.

Per le variabili statiche vuote, l'inizializzazione è stata eseguita dal blocco statico.

public class StaticDemo 
{ 
    private static final String name; 

    static 
    { 
     name = "yash"; 
    } 
} 

e perché utilizzare uno bianco? dato che potrebbe non essere possibile inizializzare all'inizio. Accetto quello precedente.

0

Se l'inizializzatore per un campo statico può generare un'eccezione, non è possibile inizializzarlo in una riga, è necessario disporre di un blocco statico o di un metodo statico.

+0

grazie! Può essere un uso della variabile finale statica non inizializzata. –

0

La variabile finale statica deve essere inizializzata al momento della creazione, diversamente dalle variabili finali vuote, non è possibile rinviare l'inizializzazione al costruttore perché sono statici.

Problemi correlati