6

我需要一些类/接口名称来描述不可变的有序集(按输入顺序,如LinkedHashSet)。我当然可以像这样使用这个类:

class Foo {
    public final Set<Long> frozenOrderedSet;

    public Foo(List<Long> input) {
        frozenOrderedSet = Collections.unmodifiableSet(new LinkedHashSet(input));
    }
}

但这不会澄清我的方法。我想向阅读源代码的每个人说明,Set 是不可修改且唯一的,同时保持它的顺序for(Long l : set){}

4

3 回答 3

11

Guava 的 ImmutableSet提供了a high-performance, immutable Set with reliable, user-specified iteration order. 类似ImmutableSortedSet的变体。

于 2014-07-28T23:01:53.887 回答
3

最简单的方法是扩展 Set 以创建自定义的不可变 Set。

public CustomImmutableSet(){ return Collections.unmodifiableSet(new LinkedHashSet(input)); }

这样一来,每个阅读源代码的人都会清楚 Set 是不可修改且唯一的

于 2014-07-28T23:03:10.470 回答
0

Bozho 有问题的Java 不可变集合

不可修改的集合通常是其他集合的只读视图(包装器)。您无法添加、删除或清除它们,但基础集合可以更改。

不可变集合根本无法更改——它们不包装另一个集合——它们有自己的元素。

这是番石榴的 ImmutableList 的引述

与 Collections.unmodifiableList(java.util.List) 不同,后者是仍然可以更改的单独集合的视图,ImmutableList 的实例包含自己的私有数据并且永远不会更改。

因此,基本上,为了从可变集合中获得不可变集合,您必须将其元素复制到新集合中,并禁止所有操作。

所以基本上你可以创建类的子类TreeSet并覆盖所有:add、remove 等方法,只抛出一个异常,说这是不可变的集合。此外,您还必须使用一个参数在此类中创建复制构造函数TreeSet setToCopyFrom

于 2014-08-24T01:36:29.437 回答