2011-11-03 19 views
26

Come sappiamo lo scopo della parola chiave "finale" in java. Mentre dichiariamo una variabile come finale, dobbiamo inizializzare la variabile. come "final int a = 10;" Non possiamo modificare il valore di "a". Ma se optiamo per HashTable, è possibile aggiungere qualche valore dichiarando anche l'HashTable come finale.Creazione di Hashtable come finale in java

Esempio ::

private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() 
{{  put("foo",  1);  
     put("bar",  256);  
     put("data",  3);  
     put("moredata", 27);  
     put("hello", 32);  
     put("world", 65536); }}; 

ora sto dichiarando la MYHASH HashTable come definitiva. Se provo ad aggiungere altri elementi a questo, è il suo accettare.

MYHASH.put("NEW DATA",  256); 

Ora "NEW DATA" viene aggiunto a HashTable. Le mie domande è: perché permette di aggiungere anche la sua dichiarazione come finale ????

+0

Nota se il contenuto della mappa sono stati mutabile ('java.util.Date' o' java.awt.Point', per esempio), allora è ancora mutevole. –

risposta

63

Perché il punteggio finale indica il riferimento, non l'oggetto. Non è possibile impostare quel punto di riferimento su una tabella hash diversa. Ma puoi fare qualsiasi cosa per quell'oggetto, incluso aggiungere e rimuovere cose.

L'esempio di int è un tipo primitivo, non un riferimento. Finale significa che non puoi cambiare il valore della variabile. Pertanto, con uno int non è possibile modificare il valore della variabile, ad es. rendere diverso il valore dello int. Con un riferimento a un oggetto, non è possibile modificare il valore del riferimento, ovvero l'oggetto a cui punta.

0

Per campi e variabili, utilizzando final significa che possono essere assegnati solo una volta. O immediatamente, o in un secondo momento (ad esempio in un costruttore per i campi). Ciò non significa che l'istanza effettiva diventa immutabile. Un Hashtable è una struttura dati a cui è possibile aggiungere voci, indipendentemente dal modo in cui è stata assegnata ad alcune variabili. Solo il riferimento è definitivo.

6

Prova e avvolgi il tuo Hashtable con una mappa non modificabile utilizzando Collections.unmodifiableMap(MYHASH ). Ciò dovrebbe generare eccezioni quando si tenta di modificare qualcosa nella mappa, ad esempio aggiungere o rimuovere voci. (Si noti che MYHASH dovrebbe quindi essere di tipo Map<String, String> e non Hashtable<String, String>.)

Per quanto riguarda la parola chiave final: come gli altri già detto, significa che non è possibile assegnare un altro Hashtable-MYHASH ma la mappa stessa è ancora mutevole. Per cambiare questo devi avvolgerlo con un wrapper immutabile, come lo UnmodifiableMap menzionato sopra.

12

Solo il riferimento è definitivo, i suoi metodi possono naturalmente essere chiamati come per un riferimento non finale.

Utilizzare Collections.unmodifiableMap(map) per rendere una mappa non modificabile.

4

Come ha detto Joe, questo perché final contrassegna il riferimento non l'oggetto.

Tuttavia, si può fare quello che vuoi con Collections.unmodifiableMap (vedi here)

8

È possibile utilizzare Collections.unmodifiableMap per ottenere un involucro immodificabile sopra la tabella di hash.

Esempio:

import java.util.*; 
class Test{ 

    public static final Map<String,Integer> MYHASH; 
    static{ 
     Hashtable<String,Integer> tmp = 
      new Hashtable<String,Integer>(); 
     tmp.put("A",65); 
     tmp.put("C",67); 
     MYHASH = Collections.unmodifiableMap(tmp); 
    } 

    public static void main(String[] args){ 

     System.out.println(MYHASH.get("A")); 

     //this will throw 
     //java.lang.UnsupportedOperationException 
     MYHASH.put("B",66);  

    } 

} 
+1

Ottieni il mio +1 perché chiaramente non stai mantenendo la versione mutabile della mappa in modo da essere inavvertitamente mutata. Avrei preferito mantenere l'immutabile statica 'privata'. Non ha senso usare "Hashtable". –

+0

Grazie! Sono andato con 'Hashtable' per coerenza con la domanda, ma non avevo notato il' private'. – Vlad

+0

Grazie anche a risolvere il mio problema. – bean