【问题标题】:Class that describes a immutable, ordered set描述不可变的有序集合的类
【发布时间】:2014-07-28 22:53:34
【问题描述】:

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

class Foo {
    public final Set<Long> frozenOrderedSet;

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

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

【问题讨论】:

  • 按照SortedSet 的顺序排列还是按照LinkedHashSet 提供的那种顺序排列?
  • 好的,输入订单。我可能会在 unmodifiableSet 包装器中使用 LinkedHashSet,但我们会看看其他人是否知道更具体的内容。
  • Guava 提供an implementation
  • 是的,按照 John Entwistle 说的做,使用 Guava。

标签: java unordered-set unmodifiable


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    这样可以让阅读源代码的每个人都清楚该 Set 是不可修改且唯一的

    【讨论】:

      【解决方案3】:

      博卓有问题Java Immutable Collections

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

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

      这是来自 guava 的 ImmutableList 的引述

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

      所以,基本上,为了从 可变的,您必须将其元素复制到新集合中,并且 禁止所有操作。

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

      【讨论】:

        猜你喜欢
        • 2015-07-03
        • 1970-01-01
        • 2019-10-10
        • 1970-01-01
        • 1970-01-01
        • 2021-06-26
        • 1970-01-01
        • 2018-02-24
        • 2011-03-28
        相关资源
        最近更新 更多