【问题标题】:Why would someone use Collections.emptyList in java? [duplicate]为什么有人会在 java 中使用 Collections.emptyList? [复制]
【发布时间】:2012-09-17 19:35:21
【问题描述】:

可能重复:
Collections.emptyList() vs. new instance

我试图了解使用以下方法创建列表的新实例之间的区别:

new ArrayList<X>

Collections.emptyList();

据我了解,后者返回一个不可变列表。这意味着无法添加、删除或修改它。 我想知道为什么要创建和不可变的 emptyList ?有什么用? 谢谢

【问题讨论】:

  • 可能已回答here
  • 不变性对你有好处!
  • 这不是重复的。该链接的问题是关于 sth vs sth 而这询问为什么有人应该首先使用不可变的 emptyList。那么它是如何重复的呢?

标签: java list collections


【解决方案1】:

不可变允许可重复使用的实例。

Collections.emptyList 将始终返回完全相同的单例实例。

这非常有效。

除此之外,不可变数据可以在线程之间安全地共享,并保证避免由于编码错误而产生的奇怪副作用。因此,它也不需要防御性副本。

【讨论】:

    【解决方案2】:

    假设您必须返回一个集合,并且您不想每次都创建几个对象。

    interface Configurable {
        List<String> getConfigurationList();
    }
    
    // class which doesn't have any configuration
    class SimpleConfigurable implements Configurable {
        public List<String> getConfigurationList() { return Collections.emptyList(); }
    }
    

    返回一个空集合通常比返回null更可取

    【讨论】:

    • 如果SimpleConfigurable类的客户端尝试向getConfigurationList()返回的空列表添加元素怎么办;
    • 他们得到一个异常,这可能是你作为SimpleConfigurable 的设计者想要的。如果我可以解释整个 [pure-programming](wikipedia.org/wiki/Pure_function) 论点,返回可变对象的函数的语义是什么?如果有人向返回值添加元素(例如:更新应用的配置),您的库会采取一些措施吗?您的库会缓存为getConfigList() 的下一个调用者返回的实例吗?你如何使这一切都是线程安全的?返回一个不可修改的列表为我们提供了对这些问题的一个非常简单的答案。
    • @Groostav 返回 unmodifiableList 是最好的,除非您 a) 希望通过设计进行修改 b) 您已将其描述为性能问题。
    【解决方案3】:

    我经常使用空列表作为Null objects:这样可以避免检查null

    【讨论】:

    • 但是无论如何我们甚至不能使用 get() 来处理它,那它有什么好处呢?我发现的一个好处是我们可以迭代它与 null 相反。
    • 可以调用更多典型的条件使用方法,如size()isEmpty()
    【解决方案4】:

    我已将 Collections.emptyList 用于返回列表但使用没有意义的参数调用的方法。

    例如,您希望访问流的不同部分(可能基于日期)的流处理应用程序。您从流中查询项目的时间跨度,但如果在该时间跨度内没有项目,您将返回一个空列表。抛出异常没有任何意义,因为查询没有任何问题。返回null 也没有多大意义,因为所有调用代码都需要检查null

    返回不可变的空列表允许调用代码很好地处理返回值,您无需担心线程问题,因为不可变列表本质上是线程安全的。

    【讨论】:

      【解决方案5】:

      为了避免不需要的 NullPointerException。

      在您的代码中,您可能会返回一个普通的“空”ArrayList 而不是返回 null。但是,这样一来,您将在每次执行时继续创建新对象(默认容量为 10),这不是一种内存高效的方法。相反,如果您返回 emptyList,则每次调用都会返回相同的实例。这样,它以更有效的方式将您从不需要的 NullPointerException 中拯救出来。这是空列表的 Javadoc 的片段:

      /**
       * Returns the empty list (immutable).  This list is serializable.
       *
       * <p>This example illustrates the type-safe way to obtain an empty list:
       * <pre>
       *     List&lt;String&gt; s = Collections.emptyList();
       * </pre>
       * Implementation note:  Implementations of this method need not
       * create a separate <tt>List</tt> object for each call.   Using this
       * method is likely to have comparable cost to using the like-named
       * field.  (Unlike this method, the field does not provide type safety.)
       *
       * @see #EMPTY_LIST
       * @since 1.5
       */
      

      【讨论】:

        猜你喜欢
        • 2014-03-11
        • 2016-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-30
        • 2013-05-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多