【问题标题】:Guava immutable collections useful or just extra overhead?Guava 不可变集合有用还是只是额外的开销?
【发布时间】:2016-03-15 09:46:51
【问题描述】:

我正在查看一些源代码,它似乎几乎到处都在使用 Guava 的不可变集合。现在,这个应用程序不是多线程的,所以并发性不是问题。

我正在查看 guava 的 github wiki,它说 - 当您不希望修改集合或希望集合保持不变时,最好将其防御性地复制到不可变集合中。

现在我的问题是 - 制作集合的防御性副本是否是个好主意,即使它们没有暴露在外部并且在应用程序内部使用,还是在这种情况下这是不必要的额外开销?我只是好奇。

【问题讨论】:

  • 很有可能,但这通常是个人喜好问题。不可变集合通常也更节省内存。

标签: java guava immutability


【解决方案1】:

如果您的类传递了一个它存储的集合,那么无论如何最好采取防御性副本。这样,它与外部世界分离,您可以确定地推断您的类,并且未来对外部世界的更改不会破坏您的类的假设(例如,如果在将集合传递给构造函数后对其进行了外部修改)。请参阅有效的 Java 项目 39。

由于您的默认立场应该是防御性复制,因此在有意义的情况下使该复制不可变非常有用。这会立即告诉读者有关该集合的更多信息:其内容永远不会改变。这也意味着您也不需要在 getter 方法中防御性地复制 out:直接返回不可变集合即可。这也为您班级的用户提供了更多信息。

此外,如果您传递给类的集合恰好是兼容的 Immutable 类型,那么 Guava 很聪明,实际上不会复制。因此,通过广泛采用不变性,您最终可以获得防御性复制的所有好处,而几乎没有任何成本。

提示:请参阅ImmutableCollection javadoc 以获取有关应在何处以及为何声明事物的建议,例如ImmutableListList.

【讨论】:

  • 另见有效 Java 条款 15。
猜你喜欢
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 2015-09-14
相关资源
最近更新 更多