Wolę używać statycznego inicjalizatora, aby uniknąć generowania anonimowych klas (co nie miałoby żadnego dalszego celu), dlatego wymienię wskazówki dotyczące inicjowania przy użyciu statycznego inicjatora. Wszystkie wymienione rozwiązania / wskazówki są bezpieczne dla typu.
Uwaga: pytanie nie mówi nic o uczynieniu mapy niemodyfikowalną, więc pominę to, ale wiem, że można to łatwo zrobić Collections.unmodifiableMap(map)
.
Pierwsza wskazówka
Pierwsza wskazówka jest taka, że możesz zrobić lokalne odniesienie do mapy i nadać jej KRÓTKĄ nazwę:
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");
}
Druga wskazówka
Druga wskazówka jest taka, że możesz utworzyć metodę pomocnika, aby dodać wpisy; możesz również upublicznić tę metodę pomocniczą, jeśli chcesz:
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);
}
Metoda pomocnicza tutaj nie nadaje się do ponownego użycia, ponieważ może tylko dodawać elementy myMap2
. Aby uczynić go ponownie użytecznym, moglibyśmy uczynić samą mapę parametrem metody pomocniczej, ale wtedy kod inicjujący nie byłby krótszy.
Trzecia wskazówka
Trzecia wskazówka polega na tym, że możesz stworzyć klasę pomocniczą podobną do konstruktora z wypełniającą funkcjonalnością. To naprawdę prosta, 10-liniowa klasa pomocnicza, która jest bezpieczna dla typu:
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
}
}