Ben statik bir başlatıcısı ile başlangıç ipuçlarını listeler (anonim sınıfları oluşturmak için önlemek için statik bir başlatıcısı kullanmayı tercih, bu yüzden ben statik bir başlatıcısı ile başlangıç ipuçları listeleyeceğim. Listelenen tüm çözümler / ipuçları tipte güvenlidir.
Not: Soru, haritayı değiştirilemez hale getirmeyle ilgili bir şey söylemiyor, bu yüzden bunu dışarıda bırakacağım, ancak bunun kolayca yapılabileceğini biliyorum Collections.unmodifiableMap(map)
.
İlk ipucu
İlk ipucu, haritaya yerel bir referans yapabilmeniz ve buna KISA bir ad vermenizdir:
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");
}
İkinci ipucu
İkinci ipucu, giriş eklemek için bir yardımcı yöntem oluşturabilmenizdir; ayrıca şunları yapmak istiyorsanız bu yardımcı yöntemi herkese açık yapabilirsiniz:
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);
}
Buradaki yardımcı yöntem yeniden kullanılamaz, çünkü yalnızca öğelere öğe ekleyebilir myMap2
. Yeniden kullanılabilir hale getirmek için haritanın kendisini yardımcı yöntemin bir parametresi yapabiliriz, ancak başlatma kodu daha kısa olmazdı.
Üçüncü ipucu
Üçüncü ipucu, doldurma işleviyle yeniden kullanılabilir oluşturucu benzeri bir yardımcı sınıf oluşturabilmenizdir. Bu gerçekten tip-güvenli, 10 satırlı basit bir yardımcı sınıftır:
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
}
}