2016-03-14 16 views
0

我正在看一些源代碼,它似乎幾乎無處不在使用番石榴的不變集合。現在,這個應用程序不是多線程的,所以併發性不是問題。番石榴不可變的集合有用或只是額外的開銷?

我一直在尋找在番石榴的GitHub的wiki和它說 - 如果你不希望修改的集合,或者期待的集合保持不變,這是一個很好的做法,防守其複製到不可變集合。

現在我的問題是 - 這是個好主意,即使他們未被暴露在外面,並且應用程序內部使用集合的防守副本或者是在這種情況下的不必要的額外開銷?我只是好奇。

+1

很有可能,但是這通常是口味的問題。不變的集合通常也更有效率。 –

回答

3

如果你的類是通過它存儲的集合,它是無論如何採取防禦性的副本是一個好主意。通過這種方式,它與外部世界脫鉤,並且可以確定地推斷你的類,而未來對外部世界的改變不會破壞你的類的假設(例如,如果集合在傳遞給構造函數之後被外部修改)。請參閱有效的Java項目39

由於默認的立場應該是防守複製,它是真正有益的,使該副本一成不變的,只要是有道理的。這會立即告訴讀者關於該集合的更多信息:其內容永遠不會改變。這也意味着你不需要在getter-methods中將中進行防禦性複製:直接返回不可變集合。這也給了你的班級用戶更多的信息。

此外,如果你傳入你的班級的集合恰好是兼容的不可變類型,番石榴是聰明的,並且不會實際上做一個副本。因此,通過廣泛接受不變性,您將獲得防禦性複製的所有好處,幾乎沒有任何成本。

提示:看的見的ImmutableCollection的Javadoc的意見在哪裏,以及爲什麼你應該如申報物品ImmutableList vs List

+1

另請參見有效的Java項目15。 – mfulton26