我需要一些描述不可变有序集的类/接口名称(按输入顺序,如LinkedHashSet
)。我当然可以像这样使用这个类:
class Foo {
public final Set<Long> frozenOrderedSet;
public Foo(List<Long> input) {
frozenOrderedSet = Collections.unmodifiableSet(new LinkedHashSet(input));
}
}
但这不会澄清我的做法。我想向所有阅读消息来源的人说清楚Set是不可修改且独特的,同时用for(Long l : set){}
维护它的顺序。
答案 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
创建复制构造函数。