मैं अनाम कक्षाओं को बनाने से बचने के लिए एक स्थिर इनिशियलाइज़र का उपयोग करना पसंद करता हूं (जिसका कोई और उद्देश्य नहीं होगा), इसलिए मैं स्टैटिक इनिशियलाइज़र के साथ इनिशियलाइज़िंग की युक्तियों को सूचीबद्ध करूँगा। सभी सूचीबद्ध समाधान / सुझाव टाइप-सुरक्षित हैं।
नोट: यह प्रश्न मानचित्र को अप्रमाणिक बनाने के बारे में कुछ नहीं कहता है, इसलिए मैं इसे छोड़ दूंगा, लेकिन यह जानता हूं कि यह आसानी से किया जा सकता है Collections.unmodifiableMap(map)
।
पहली टिप
पहली टिप यह है कि आप नक्शे का स्थानीय संदर्भ बना सकते हैं और आप इसे SHORT नाम दे सकते हैं:
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
। इसे फिर से प्रयोग करने योग्य बनाने के लिए, हम मानचित्र को सहायक विधि का एक पैरामीटर बना सकते हैं, लेकिन तब आरंभीकरण कोड कम नहीं होगा।
तीसरा सिरा
3 टिप यह है कि आप पॉपुलेटिंग कार्यक्षमता के साथ फिर से उपयोग करने योग्य बिल्डर जैसे सहायक वर्ग बना सकते हैं। यह वास्तव में एक सरल, 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
}
}