Vin*_*C M 133 java collections
我可以使用哪些情况Collections.emptyMap()?文档说如果我希望我的集合是不可变的,我可以使用这个方法.
为什么我想要一个不可变的空集合?有什么意义?
Sum*_*ngh 137
从有效的Java, 项目#43 - "Return empty arrays or collections, not null"演示返回一个空的集合,甚至演示如何使用这些emptyList(),emptySet()和emptyMap()对集合类的方法来得到一个空的集合,也有保持不变的额外好处.来自 第15项 "Minimize Mutability".
来自Collections-emptySet-Collections-emptyList-Collections
它是一种编程习语.这适用于不想要空变量的人.因此,在初始化集合之前,他们可以使用空集.
注意:下面的代码只是一个示例(根据您的使用情况进行更改):
private Set myset = Collections.emptySet();
void initSet() {
myset = new HashSet();
}
void deleteSet() {
myset = Collections.emptySet();
}
Run Code Online (Sandbox Code Playgroud)
这些方法提供了几个优点:
它们更简洁,因为您不需要显式地键入集合的泛型类型 - 它通常只是从方法调用的上下文中推断出来.
它们更有效率,因为它们不会打扰创建新对象; 他们只是重用现有的空和不可变对象.这种效果通常很小,但偶尔(很少,很少)很重要.
Aff*_*ffe 32
诚然,根据我的个人经验,在API需要参数集合的情况下非常有用,但您无需提供任何参数.例如,您可能有一个看起来像这样的API,并且不允许空引用:
public ResultSet executeQuery(String query, Map<String, Object> queryParameters);
Run Code Online (Sandbox Code Playgroud)
如果你有一个不带任何参数的查询,那么创建一个HashMap肯定有点浪费,它涉及分配一个数组,当你可以传入实际上是常量的'Empty Map'时,它的实现方式在java.util.Collections.
有几种情况您更喜欢使用不可变的地图,列表,集合或其他类型的集合.
首先,可以说是最重要的用例是,无论何时返回查询结果或返回结果集(或列表或映射)的计算,您都应该使用不可变数据结构.
在这种情况下,我更喜欢返回这些的不可变版本,因为这更加清楚地反映了计算结果集的事实不变性 - 无论您以后对数据做什么,您从查询中收到的结果集都不应该更改.
第二个常见用例是当您需要提供参数作为方法或服务的输入时.除非您希望通过服务或方法修改输入集合(这通常是一个非常糟糕的设计理念),否则在许多情况下传入不可变集合而不是可变集合可能是合理且安全的选择.
我认为它是"按价值传递"的惯例.
更一般地说 - 只要数据跨越模块或服务边界,就使用不可变数据结构是一种明智的做法.这使得更容易推理(不可变)输入/输出和可变内部状态之间的差异.
这样做的一个非常有益的副作用是提高模块/服务的安全性和线程安全性,并确保更清晰地分离关注点.
使用Collections.empty*()方法的另一个好理由是它们明显缺乏冗长.在Java7之前的时代,如果你有一个通用的集合,你必须在整个地方撒上泛型类型的注释.
只需比较这两个声明:
Map<Foo, Comparable<? extends Bar>> fooBarMap = new HashMap<Foo, Comparable<? extends Bar>>();
Run Code Online (Sandbox Code Playgroud)
与:
Map<Foo, Comparable<? extends Bar>> fooBarMap = Collections.emptyMap();
Run Code Online (Sandbox Code Playgroud)
后者显然在两个重要方面取得了可读性:
fooBarMap另一个非空值的位置/fooBarMap =/.首先,您可以通过参考共享来逃避.A new HashMap()等将需要一个已分配的对象,并且可能需要一些额外的元素来保存数据,但是您只需要一个不可变空集合的副本(列表,集合,映射或任何其他类似).当您调用的方法需要接受Map但不需要编辑它时,这是一个明显的选择.
我建议查看Josh Bloch的Effective Java,它列出了一些非常好的不可变对象属性(包括线程安全性).
| 归档时间: |
|
| 查看次数: |
41158 次 |
| 最近记录: |