我需要创建一个空地图。
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
问题是上面的代码会产生以下警告: 类型安全性:未经检查的从Map转换为HashMap
创建此空地图的最佳方法是什么?
我需要创建一个空地图。
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
问题是上面的代码会产生以下警告: 类型安全性:未经检查的从Map转换为HashMap
创建此空地图的最佳方法是什么?
Answers:
1)如果地图是不可变的:
Collections.emptyMap()
// or, in some cases:
Collections.<String, String>emptyMap()
有时,当编译器无法自动确定需要哪种Map时(有时称为type Inference),您将不得不使用后者。例如,考虑这样声明的方法:
public void foobar(Map<String, String> map){ ... }
当直接将空Map传递给它时,您必须明确说明类型:
foobar(Collections.emptyMap()); // doesn't compile
foobar(Collections.<String, String>emptyMap()); // works fine
2)如果您需要能够修改地图,那么例如:
new HashMap<String, String>()
(正如tehblanx指出的)
附录:如果您的项目使用番石榴,则有以下几种选择:
1)不可变地图:
ImmutableMap.of()
// or:
ImmutableMap.<String, String>of()
当然,与相比,这里没有什么大的好处Collections.emptyMap()
。从Javadoc:
该地图的行为和性能与
Collections.emptyMap()
,并且最好主要用于代码的一致性和可维护性。
2)您可以修改的地图:
Maps.newHashMap()
// or:
Maps.<String, String>newHashMap()
Maps
也包含用于实例化其他类型地图的类似工厂方法,例如TreeMap
或LinkedHashMap
。
更新(2018):在Java 9上或更高版本上,用于创建不可变的空映射的最短代码是:
Map.of()
由于在很多情况下,空映射用于空安全设计,因此可以利用nullToEmpty
实用程序方法:
class MapUtils {
static <K,V> Map<K,V> nullToEmpty(Map<K,V> map) {
if (map != null) {
return map;
} else {
return Collections.<K,V>emptyMap(); // or guava ImmutableMap.of()
}
}
}
对于集合类似:
class SetUtils {
static <T> Set<T> nullToEmpty(Set<T> set) {
if (set != null) {
return set;
} else {
return Collections.<T>emptySet();
}
}
}
并列出:
class ListUtils {
static <T> List<T> nullToEmpty(List<T> list) {
if (list != null) {
return list;
} else {
return Collections.<T>emptyList();
}
}
}