我可以使用哪些情况Collections.emptyMap()
?文档说,如果我希望我的收藏集是不可变的,则可以使用此方法。
为什么我要一个不变的空集合?有什么意义?
[NSArray array]
,它返回一个虽然不可用但存在的对象。因此,您可以像正常对象一样玩它,而不会出错。
我可以使用哪些情况Collections.emptyMap()
?文档说,如果我希望我的收藏集是不可变的,则可以使用此方法。
为什么我要一个不变的空集合?有什么意义?
[NSArray array]
,它返回一个虽然不可用但存在的对象。因此,您可以像正常对象一样玩它,而不会出错。
Answers:
从有效的Java, 项目#43 - "Return empty arrays or collections, not null"
演示返回一个空的集合,甚至演示如何使用这些emptyList()
,emptySet()
和emptyMap()
对集合类的方法来得到一个空的集合,也有保持不变的额外好处。从 项目#15开始 "Minimize Mutability"
。
来自Collections-emptySet-Collections-emptyList-Collections
它是一种编程习语。这适用于不希望使用null变量的人。因此,在初始化集合之前,他们可以使用空集合。
注意:以下代码仅是一个示例(根据您的用例进行更改):
private Set myset = Collections.emptySet();
void initSet() {
myset = new HashSet();
}
void deleteSet() {
myset = Collections.emptySet();
}
这些方法具有两个优点:
它们更加简洁,因为您无需显式键入集合的泛型类型-通常仅从方法调用的上下文中进行推断。
它们效率更高,因为它们不必费心创建新对象。他们只是重复使用一个现有的空且不可变的对象。通常,这种影响很小,但偶尔(非常,很少)很重要。
Set
,并HashSet
在你的例子,因为整点emptySet()
方法和朋友(而不是常量Collections.EMPTY_SET
等)是他们与仿制药发挥很好。另外,使用自Java 5以来不推荐使用的功能(原始类型)不是很好的教学辅助工具。
Collection
而不是null
避免Exceptions
在后续操作中抛出的全部意图?我想,使用不可变的集合只会导致其他某种异常。和分配null
肯定是不超过分配不变的常数效率较低。
public boolean setExists() { return !myset.equals(Collections.emptySet()); }
在某些情况下,您希望使用不可变的地图,列表,集合或其他类型的集合。
第一个也是最重要的用例是,当您返回查询结果或将返回结果集(或列表或映射)的计算时,您应该更喜欢使用不可变的数据结构。
在这种情况下,我更喜欢返回它们的不可变版本,因为这更清楚地反映了计算结果集的事实不可变性-无论以后对数据做什么,从查询中获得的结果集都不应更改。
第二种常见用例是当您需要提供参数作为方法或服务的输入时。除非您期望输入集合被服务或方法修改(这通常是一个非常糟糕的设计思想),否则在许多情况下,传递不可变集合而不是可变集合可能是合理且安全的选择。
我认为这是“按价值传递”的惯例。
更笼统地说 -每当数据越过模块或服务边界时,使用不可变的数据结构是明智的做法。这使得推断(不可变的)输入/输出与可变内部状态之间的差异变得容易得多。
这是非常有益的副作用,可以提高模块/服务的安全性和线程安全性,并确保更清晰地分离问题。
使用Collections.empty*()
方法的另一个很好的理由是它们明显缺乏详细性。在Java7之前的时代,如果您有通用集合,则必须到处散布通用类型注释。
只需比较这两个声明:
Map<Foo, Comparable<? extends Bar>> fooBarMap = new HashMap<Foo, Comparable<? extends Bar>>();
与:
Map<Foo, Comparable<? extends Bar>> fooBarMap = Collections.emptyMap();
后者显然以两种重要方式赢得了可读性的传授:
fooBarMap
被分配了另一个非空值/fooBarMap =/
。为什么我要一个不变的空集合?有什么意义?
出于相同的原因,您Collections.unmodifiableMap()
有时会使用。您想返回一个Map实例,如果用户尝试修改它,它将抛出一个异常。这只是一个特例:空的Map。
为什么我要一个不变的空集合?有什么意义?
出于同样的原因,为什么您想要不可变的对象。主要是因为您知道多个线程可以访问对象的相同实例,并且它们都将看到相同的值,因此您可以在晚上安全地入睡。集合中没有任何项目仍然是您要维护的有效值。