Guava 不可变集合有用还是只是额外的开销?

Guava immutable collections useful or just extra overhead?

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

我在看 guava 的 github 维基,它说 - 如果您不希望修改集合,或者不希望集合保持不变,最好将其防御性地复制到不可变的集合。

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

如果您的 class 传递了一个它存储的集合,无论如何最好还是采用防御性副本。这样,它就与外部世界脱钩了,你可以肯定地推断你的 class,并且未来对外部世界的改变不会打破你的 class 的假设(假设集合是将其传递给构造函数后进行外部修改)。参考有效 Java 项 39.

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

此外,如果您传入 class 的集合恰好已经是兼容的 Immutable 类型,Guava 很聪明,实际上 不会复制.因此,通过广泛接受不变性,您最终可以获得防御性复制的所有好处,而成本几乎 none。

提示:请参阅 ImmutableCollection javadoc 以获得有关在何处以及为什么应该声明事物的建议,例如ImmutableList 对比 List.