不可变对象中的private final vs public final字段(java)

时间:2015-01-17 11:18:22

标签: java private immutability final public

Effective Java中的第15项规定,建议使用私有final字段作为不可变对象中的公共final字段,因为它可能阻止更改后续版本中的内部表示

我无法理解突出显示的部分 - 我无法看到更改访问说明符可能导致问题的情况。有人可以为此提供一个例子吗?

2 个答案:

答案 0 :(得分:9)

这不仅仅是更改访问说明符 - 您可能会更改有关内部表示的所有内容

假设您有三个byte值作为对象状态的一部分。您可以将它们存储在一个int字段中,或者您可以将它们存储在三个byte字段中。如果您将字段(或字段)保密,仅提供对状态的访问权限,则可以稍后更改实施。如果您使用公共字段,您的存储详细信息将成为您班级API的一部分,并且无法在不破坏兼容性的情况下进行更改。

你的类存储状态如何应该是一个实现细节,隐藏在外面的世界以便将来的灵活性。

(这不仅仅是一个理论上的问题。例如,在.NET的Noda Time项目中,我的v2.0版本将从根本上改变日期和时间的存储细节。如果我&# 39; d使状态可用作字段,这将是一个巨大的突破性变化。由于我使用了属性,这种变化对用户完全透明,而不是提高性能。)

答案 1 :(得分:0)

我不确定"以后发布"部分,但保持变量私有变得特别重要(如可能)List等可变属性。虽然您无法将引用重新分配给新列表,但如果公开,则可以随时在列表中添加或删除元素。