【发布时间】:2015-01-17 11:18:22
【问题描述】:
Effective Java 中的第 15 项指出,建议在不可变对象中使用私有最终字段而不是公共最终字段,因为它可能防止在以后的版本中更改内部表示。
我无法理解突出显示的部分 - 我看不到更改访问说明符可能会导致问题的情况,而它已经是最终的。有人可以为此提供一个例子吗?
【问题讨论】:
标签: java private immutability final public
Effective Java 中的第 15 项指出,建议在不可变对象中使用私有最终字段而不是公共最终字段,因为它可能防止在以后的版本中更改内部表示。
我无法理解突出显示的部分 - 我看不到更改访问说明符可能会导致问题的情况,而它已经是最终的。有人可以为此提供一个例子吗?
【问题讨论】:
标签: java private immutability final public
这不仅仅是更改访问说明符的问题 - 您可能会更改有关内部表示的所有内容。
假设您有三个byte 值作为对象状态的一部分。您可以将它们存储在一个 int 字段中,或者您可以将它们存储在三个 byte 字段中。如果您保持字段(或多个字段)私有,仅提供对状态的访问,您可以稍后更改您的实现。如果您使用公共字段,您的存储详细信息将成为您的类 API 的一部分,并且在不破坏兼容性的情况下无法更改。
如何你的类存储状态应该是一个实现细节,为了未来的灵活性而对外界隐藏。
(这不仅仅是一个理论上的问题。例如,在我的 .NET 中的Noda Time 项目中,我的 v2.0 版本将从根本上改变日期和时间的存储细节。如果我做了状态可作为字段使用,这将是一个重大的重大更改。因为我使用了属性,所以除了提高性能之外,此更改对用户是完全透明的。)
【讨论】:
我不确定“稍后发布”部分,但保持变量私有变得很重要,特别是在(可能)可变属性(如List)的情况下。虽然您无法将引用重新分配给新列表,但您始终可以在列表中添加或删除元素(如果它是公开的)。
【讨论】: