Java 9 提供了一种创建空的不可变列表、集合和映射的方法。
List list = List.of();
Set set = Set.of();
Map map = Map.of();
Run Code Online (Sandbox Code Playgroud)
但我无法理解创建空的不可变列表/集合/映射的实际用例是什么。
请帮助我理解空的不可变列表/集合/映射的实际用例。
想象一下应该对这些集合进行操作的常规数学运算。就像计算列表的交集一样。结果可以为空,在这种情况下,如果结果应该是不可变的,则此方法将非常有用。
public List<E> intersectLists(List<E> first, List<E> second) {
// If one is empty, return empty list
if (first.isEmpty() || second.isEmpty()) {
// Before Java 9: return Collections.emptyList();
return List.of();
}
// Compute intersection
...
}
Run Code Online (Sandbox Code Playgroud)
不可变当您通过 getter 公开内部数据结构但不希望调用者能够操作集合时,通常会使用集合。
一个类似的变体是不可修改的集合。如果您直接引用位于包装器下方的可变集合,则可以对这些进行操作。通过这种方式,您可以强制用户使用您指定的方法进行操作。
public Graph {
private List<Node> nodes;
// Other stuff
...
public List<Node> getNodes() {
// Wrap container to make list unmodifiable
return Collections.unmodifiableList(nodes);
}
// User should use designated methods to manipulate instead
public void addNode(Node node) { ... }
public void removeNode(Node node) { ... }
}
Run Code Online (Sandbox Code Playgroud)
早在 Java 9 之前,就有Collections.emptyList()、Collections.emptySet()和Collections.emptyMap(),它们明确且专门用于生成不可修改的空集合。那个List.of() 等等。能否做到这一点只是其 API 内部一致性的问题,而不是革命性的新功能。
但你的主要问题似乎是
请帮助我理解空的不可变列表/集合/映射的实际用例。
这实际上是三个问题:
空集合有哪些用例?
空集合很有用,因为它们是现实世界数据和算法中发生的情况的自然表示。例如,“到目前为止,哪些乘客已办理登机手续?” 当没有人有的时候。哪些任务正在等待调度?我可以无休止地继续下去。
不可修改集合的用例有哪些?
可以传递对不可修改集合的引用,而不必担心该集合会被修改(无论如何,通过该引用)。请注意,假设不可修改性已得到适当记录,则共享该对象的所有参与者都可以依赖它不会更改。除此之外,这对于安全共享集合(和其他不可修改的对象)而不复制它们非常重要。
这些用例有哪些交叉点?
空集合在现实世界的数据和算法中自然出现,因此不可修改集合的大多数用例都包含空集合。
此外,您没有询问,但可能忽略了,虽然您无法将对象添加到不可修改的空集合中,但您可以将其完全替换为非空集合,或者下次提供非空集合,或类似的。
| 归档时间: |
|
| 查看次数: |
500 次 |
| 最近记录: |