Je préfère utiliser un initialiseur statique pour éviter de générer des classes anonymes (qui n'auraient plus de raison d'être), donc je vais lister des astuces pour l'initialisation avec un initialiseur statique. Toutes les solutions / conseils répertoriés sont de type sécurisé.
Remarque: La question ne dit rien sur le fait de rendre la carte non modifiable, donc je vais laisser cela de côté, mais sachez que cela peut facilement être fait avec Collections.unmodifiableMap(map)
.
Premier conseil
La première astuce est que vous pouvez faire une référence locale à la carte et lui donner un nom COURT:
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");
}
Deuxième conseil
La deuxième astuce est que vous pouvez créer une méthode d'aide pour ajouter des entrées; vous pouvez également rendre cette méthode d'assistance publique si vous souhaitez:
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);
}
La méthode d'assistance ici n'est cependant pas réutilisable car elle ne peut qu'ajouter des éléments à myMap2
. Pour le rendre réutilisable, nous pourrions faire de la carte elle-même un paramètre de la méthode d'assistance, mais alors le code d'initialisation ne serait pas plus court.
Troisième conseil
La troisième astuce est que vous pouvez créer une classe d'aide de type constructeur réutilisable avec la fonctionnalité de remplissage. Il s'agit vraiment d'une classe auxiliaire simple de 10 lignes qui est de type sécurisé:
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
}
}