Domanda

Devo creare una mappa vuota.

if (fileParameters == null)
    fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;

Il problema è che il codice precedente produce questo avviso: Sicurezza del tipo: cast non selezionato da Mappa a HashMap

Qual è il modo migliore per creare questa mappa vuota?

È stato utile?

Soluzione

1) Se la mappa può essere immutabile:

Collections.emptyMap()

// or, in some cases:
Collections.<String, String>emptyMap()

Dovrai usare quest'ultimo a volte quando il compilatore non riesce a capire automaticamente quale tipo di Mappa è necessaria (questo si chiama tipo inferenza ). Ad esempio, considera un metodo dichiarato come questo:

public void foobar(Map<String, String> map){ ... }

Quando passi la Mappa vuota direttamente ad essa, devi essere esplicito sul tipo:

foobar(Collections.emptyMap());                 // doesn't compile
foobar(Collections.<String, String>emptyMap()); // works fine

2) Se devi essere in grado di modificare la mappa, ad esempio:

new HashMap<String, String>()

(come tehblanx sottolineato )


Addendum : se il tuo progetto utilizza Guava , hai le seguenti alternative:

1) Mappa immutabile:

ImmutableMap.of()
// or:
ImmutableMap.<String, String>of()

Concesso, nessun grande vantaggio qui rispetto a Collections.emptyMap(). Da il Javadoc :

  

Questa mappa si comporta e si comporta in modo comparabile a Maps,   ed è preferibile principalmente per la coerenza e la manutenibilità del tuo   codice.

2) Mappa che puoi modificare:

Maps.newHashMap()
// or:
Maps.<String, String>newHashMap()

TreeMap contiene metodi di fabbrica simili per l'istanza anche di altri tipi di mappe, come LinkedHashMap o <=> .


Aggiornamento (2018) : su Java 9 o più recente, il codice più breve per creare una mappa vuota immutabile è:

Map.of()

... utilizzando il nuovo metodi di convenienza da 269 JEP . & # 128526;

Altri suggerimenti

Se hai bisogno di un'istanza di HashMap, il modo migliore è:

fileParameters = new HashMap<String,String>();

Dato che Map è un'interfaccia, è necessario selezionare una classe che la crea un'istanza se si desidera creare un'istanza vuota. HashMap sembra buono come qualsiasi altro - quindi basta usare quello.

O Collections.emptyMap() o se l'inferenza del tipo non funziona nel tuo caso,
Collections.<String, String>emptyMap()

Poiché in molti casi viene utilizzata una mappa vuota per la progettazione null-safe, è possibile utilizzare il metodo di utilità nullToEmpty:

class MapUtils {

  static <K,V> Map<K,V> nullToEmpty(Map<K,V> map) {
    if (map != null) {
      return map;
    } else {
       return Collections.<K,V>emptyMap(); // or guava ImmutableMap.of()
    }
  }

}  

Allo stesso modo per i set:

class SetUtils {

  static <T> Set<T> nullToEmpty(Set<T> set) {
    if (set != null) {
      return set;
    } else {
      return Collections.<T>emptySet();
    }
  }

}

ed elenchi:

class ListUtils {

  static <T> List<T> nullToEmpty(List<T> list) {
    if (list != null) {
      return list;
    } else {
      return Collections.<T>emptyList();
    }
  }

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top