描述不可变有序集的类

时间:2014-07-28 22:53:35

标签: java unordered-set unmodifiable

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

class Foo {
    public final Set<Long> frozenOrderedSet;

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

但这不会澄清我的做法。我想向所有阅读消息来源的人说清楚Set是不可修改且独特的,同时用for(Long l : set){}维护它的顺序。

3 个答案:

答案 0 :(得分:11)

Guava's ImmutableSet提供a high-performance, immutable Set with reliable, user-specified iteration order.还有ImmutableSortedSet等变体。

答案 1 :(得分:2)

最简单的方法是将Set设置为创建自定义不可变集。

  

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

通过这种方式,每个阅读源代码的人都可以清楚地知道Set是不可修改且唯一的

答案 2 :(得分:0)

Bozho问题Java Immutable Collections

  

不可修改的集合通常是只读视图(包装器)   其他收藏品。你不能添加,删除或清除它们,但是   基础集合可以改变。

     

不可更改的集合根本无法更改 - 它们不会换行   另一个集合 - 他们有自己的元素。

     

以下是番石榴的ImmutableList

的引用      

与Collections.unmodifiableList(java.util.List)不同,   这是一个单独的集合的视图,仍然可以改变,一个   ImmutableList的实例包含自己的私有数据,永远不会   变化

     

所以,基本上,为了获得一个不可变的集合   可变的,你必须将其元素复制到新的集合,和   不允许所有操作。

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