Preferisco usare un inizializzatore statico per evitare di generare classi anonime (che non avrebbero ulteriori scopi), quindi elencherò i suggerimenti per l'inizializzazione con un inizializzatore statico. Tutte le soluzioni / i suggerimenti elencati sono sicuri per i tipi.
Nota: la domanda non dice nulla su come rendere la mappa immodificabile, quindi lo tralascio, ma so che può essere facilmente risolto Collections.unmodifiableMap(map)
.
Primo consiglio
Il primo consiglio è che puoi fare un riferimento locale alla mappa e dargli un nome BREVE:
private static final Map<Integer, String> myMap = new HashMap<>();
static {
final Map<Integer, String> m = myMap; // Use short name!
m.put(1, "one"); // Here referencing the local variable which is also faster!
m.put(2, "two");
m.put(3, "three");
}
Secondo consiglio
Il secondo suggerimento è che è possibile creare un metodo di supporto per aggiungere voci; puoi anche rendere pubblico questo metodo di supporto se vuoi:
private static final Map<Integer, String> myMap2 = new HashMap<>();
static {
p(1, "one"); // Calling the helper method.
p(2, "two");
p(3, "three");
}
private static void p(Integer k, String v) {
myMap2.put(k, v);
}
Il metodo helper qui non è riutilizzabile perché può solo aggiungere elementi a myMap2
. Per renderlo riutilizzabile, potremmo rendere la mappa stessa un parametro del metodo helper, ma il codice di inizializzazione non sarebbe più breve.
Terzo consiglio
Il terzo suggerimento è che puoi creare una classe helper riutilizzabile simile a un costruttore con la funzionalità di popolamento. Questa è davvero una semplice classe di helper a 10 righe che è sicura per i tipi:
public class Test {
private static final Map<Integer, String> myMap3 = new HashMap<>();
static {
new B<>(myMap3) // Instantiating the helper class with our map
.p(1, "one")
.p(2, "two")
.p(3, "three");
}
}
class B<K, V> {
private final Map<K, V> m;
public B(Map<K, V> m) {
this.m = m;
}
public B<K, V> p(K k, V v) {
m.put(k, v);
return this; // Return this for chaining
}
}