Prefiero usar un inicializador estático para evitar generar clases anónimas (que no tendrían ningún otro propósito), por lo que enumeraré sugerencias para inicializar con un inicializador estático. Todas las soluciones / consejos enumerados son de tipo seguro.
Nota: La pregunta no dice nada acerca de hacer que el mapa no se pueda modificar, por lo que lo dejaré fuera, pero sé que se puede hacer fácilmente Collections.unmodifiableMap(map)
.
Primer consejo
El primer consejo es que puedes hacer una referencia local al mapa y darle un nombre CORTO:
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");
}
Segundo consejo
El segundo consejo es que puede crear un método auxiliar para agregar entradas; También puede hacer público este método auxiliar si desea:
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);
}
El método de ayuda aquí no es reutilizable porque solo puede agregar elementos a myMap2
. Para que sea reutilizable, podríamos convertir el mapa en sí mismo en un parámetro del método auxiliar, pero el código de inicialización no sería más corto.
Tercer consejo
El tercer consejo es que puede crear una clase de ayuda reutilizable tipo constructor con la funcionalidad de completar. Esta es realmente una clase auxiliar simple de 10 líneas que es de tipo seguro:
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
}
}