Ich bevorzuge die Verwendung eines statischen Initialisierers, um zu vermeiden, dass anonyme Klassen generiert werden (was keinen weiteren Zweck hätte). Daher werde ich Tipps auflisten, die mit einem statischen Initialisierer initialisiert werden. Alle aufgeführten Lösungen / Tipps sind typsicher.
Hinweis: Die Frage sagt nichts darüber aus, wie die Karte nicht geändert werden kann, daher werde ich das weglassen, aber ich weiß, dass dies leicht möglich ist Collections.unmodifiableMap(map)
.
Erster Tipp
Der erste Tipp ist, dass Sie einen lokalen Verweis auf die Karte erstellen und ihr einen KURZEN Namen geben können:
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");
}
Zweiter Tipp
Der zweite Tipp ist, dass Sie eine Hilfsmethode zum Hinzufügen von Einträgen erstellen können. Sie können diese Hilfsmethode auch öffentlich machen, wenn Sie:
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);
}
Die Hilfsmethode kann hier jedoch nicht wiederverwendet werden, da nur Elemente hinzugefügt werden können myMap2
. Um es wiederverwendbar zu machen, könnten wir die Karte selbst zu einem Parameter der Hilfsmethode machen, aber dann wäre der Initialisierungscode nicht kürzer.
Dritter Tipp
Der dritte Tipp ist, dass Sie mit der Auffüllfunktion eine wiederverwendbare Builder-ähnliche Hilfsklasse erstellen können. Dies ist wirklich eine einfache Helferklasse mit 10 Zeilen, die typsicher ist:
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
}
}