我喜欢使用静态初始化器来避免产生没有任何进一步用途的匿名类,因此我将列出使用静态初始化器进行初始化的提示。所有列出的解决方案/提示都是类型安全的。
注意:问题没有说要使地图不可修改,因此我会将其留空,但请知道可以使用Collections.unmodifiableMap(map)轻松完成这项工作。
第一个提示
第一条建议是您可以对地图进行本地引用,并给它一个简短的名称:
private static final Map<Integer, String> myMap = new HashMap<>();
static {
final Map<Integer, String> m = myMap;
m.put(1, "one");
m.put(2, "two");
m.put(3, "three");
}
第二个提示
第二个提示是你可以创建一个帮助方法来添加条目;如果需要,你还可以将此帮助方法声明为公共的:
private static final Map<Integer, String> myMap2 = new HashMap<>();
static {
p(1, "one");
p(2, "two");
p(3, "three");
}
private static void p(Integer k, String v) {
myMap2.put(k, v);
}
这里的帮助方法是不可重复使用的,因为它只能向myMap2
添加元素。为了使它可重复使用,我们可以将地图本身作为帮助方法的参数,但初始化代码将不会更短。
第三个提示
第三个提示是,您可以创建一个可重复使用的类似生成器的辅助类,具有填充功能。这实际上是一个简单的、有类型安全的10行辅助类:
public class Test {
private static final Map<Integer, String> myMap3 = new HashMap<>();
static {
new B<>(myMap3)
.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;
}
}
Map.of
,否则请使用Map.ofEntries
,请参见https://dev59.com/1nRB5IYBdhLWcg3wyqOo#37384773。 - akhil_mittal