当我们创建空的不可变列表/集合/映射时,是否有任何实际应用/用例

Ami*_*arg 6 java collections

Java 9 提供了一种创建空的不可变列表、集合和映射的方法。

List list = List.of(); 
Set set = Set.of(); 
Map map = Map.of();
Run Code Online (Sandbox Code Playgroud)

但我无法理解创建空的不可变列表/集合/映射的实际用例是什么。

请帮助我理解空的不可变列表/集合/映射的实际用例。

Zab*_*uza 5

想象一下应该对这些集合进行操作的常规数学运算。就像计算列表交集一样。结果可以为空,在这种情况下,如果结果应该是不可变的,则此方法将非常有用。

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)


Joh*_*ger 4

早在 Java 9 之前,就有Collections.emptyList()Collections.emptySet()Collections.emptyMap(),它们明确且专门用于生成不可修改的空集合。那个List.of() 等等。能否做到这一点只是其 API 内部一致性的问题,而不是革命性的新功能。

但你的主要问题似乎是

请帮助我理解空的不可变列表/集合/映射的实际用例。

这实际上是三个问题:

  1. 空集合有哪些用例?

    空集合很有用,因为它们是现实世界数据和算法中发生的情况的自然表示。例如,“到目前为止,哪些乘客已办理登机手续?” 当没有人有的时候。哪些任务正在等待调度?我可以无休止地继续下去。

  2. 不可修改集合的用例有哪些?

    可以传递对不可修改集合的引用,而不必担心该集合会被修改(无论如何,通过该引用)。请注意,假设不可修改性已得到适当记录,则共享该对象的所有参与者都可以依赖它不会更改。除此之外,这对于安全共享集合(和其他不可修改的对象)而不复制它们非常重要。

  3. 这些用例有哪些交叉点?

    空集合在现实世界的数据和算法中自然出现,因此不可修改集合的大多数用例都包含空集合。


此外,您没有询问,但可能忽略了,虽然您无法将对象添加到不可修改的空集合中,但您可以将其完全替换为非空集合,或者下次提供非空集合,或类似的。