Я вважаю за краще використовувати статичний ініціалізатор, щоб уникнути генерації анонімних класів (що не матиме жодної подальшої мети), тому я перерахую поради, ініціалізовані статичним ініціалізатором. Всі перераховані рішення / поради безпечні для типу.
Примітка . Питання нічого не говорить про те, щоб зробити карту незмінною, тому я не залишаю цього, але знайте, що це можна легко зробити Collections.unmodifiableMap(map)
.
Перша порада
Перша порада полягає в тому, що ви можете зробити локальну посилання на карту і дати їй коротке ім'я:
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");
}
Друга порада
Друга порада - ви можете створити допоміжний метод для додавання записів; ви також можете оприлюднити цей помічник, якщо ви хочете:
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);
}
Хелперний метод тут не можна використовувати повторно, хоча він може додавати лише елементи myMap2
. Щоб зробити його повторно використаним, ми могли б зробити саму карту параметром хелперного методу, але тоді код ініціалізації не буде коротшим.
Третя порада
Третя порада полягає в тому, що ви можете створити повторно використовуваний будівельний помічник класу з функцією заселення. Це дійсно простий 10-рядковий клас помічників, який є безпечним для типу:
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
}
}