2013-06-11 7 views
5

La domanda è praticamente auto-esplicativa. Ho una struttura di dati (ho parlato di un HashMap ma potrebbe essere un set o una lista anche), che inizialmente ho popolano:Come congelare una HashMap per evitare ulteriori modifiche?

Map<String, String> map = new HashMap<String, String>(); 

for(something) { 
    map.put(something); 
} 

Dopo che la struttura è stata popolata, non ho mai voglia di aggiungere o eliminare tutti gli elementi:

map.freeze(); 

Come si può ottenere questo utilizzando le librerie Java standard?

+0

Se lo si inserisce sempre dopo l'inizializzazione, perché non utilizzare l'inizializzazione statica? [Qui] (http://stackoverflow.com/questions/507602/how-to-initialise-a-static-map-in-java) è un buon esempio di come farlo. – colti

risposta

17

Il meglio che si può fare con le librerie JDK standard è Collections.unmodifiableMap().

Si noti che si deve rilasciare il riferimento di mappa originale, poiché tale riferimento è ancora accessibile e modificato normalmente. Se hai passato il vecchio riferimento a qualsiasi altro oggetto, saranno comunque in grado di cambiare la tua mappa.

Best practice:

map = Collections.unmodifiableMap(map); 

e assicurarsi che non hai ancora condiviso map di riferimento originale.

+4

Non proprio corretto. Se sei preoccupato che qualcuno possa mutare la mappa originale, puoi fare una copia difensiva di essa. 'map - Collections.unmodifiableMap (new HashMap (map));' Naturalmente, questo lascia ancora la questione se uno qualsiasi degli oggetti nella mappa sia esso stesso mutabile. –

3

Avvolgere in una classe e renderlo immutabile. Per esempio:

public class ImmutableMapWrapper { 

    private Map<String, String> map = new HashMap<String, String>(); 

    public ImmutableMapWrapper() { 
     for(something) { 
      this.map.put(something); 
     } 
    } 
} 
0

Creare un HashMap immutabile:

HashMap <MyKey, MyValue> unmodifiableMap = Collections.unmodifiableMap(modifiableMap); 

JavaDoc here.

Inoltre, penso che l'utilità di raccolta dati di Google (Guava ???) abbia già un tipo ImmutableMap.

7

Sembra che si farebbe molto bene con lo ImmutableMap di Guava. Che consente l'uso del pattern Builder per assemblare e "congelare".

+1

E questa è la soluzione migliore se è possibile utilizzare librerie di terze parti. –

+5

Sì, ma le domande si pongono: * Come si può ottenere ciò usando ** le librerie Java standard **? * – arshajii

+6

A volte la risposta che si desidera non è la risposta di cui si ha bisogno. – Deadron

Problemi correlati