private final 与不可变对象中的 public final 字段 (java)
private final vs public final fields in immutable objects (java)
Effective Java 中的第 15 项声明建议使用私有最终字段,而不是不可变对象中的 public 最终字段,因为它可能 阻止更改内部表示以后的版本.
我无法理解突出显示的部分 - 我看不到更改访问说明符可能导致问题的情况,因为它已经是最终的。有人可以为此提供示例吗?
这不仅仅是更改访问说明符的问题 - 您可能会更改有关内部表示的一切。
假设您有三个 byte
值作为对象状态的一部分。您 可以 将它们存储在一个 int
字段中,或者您可以将它们存储在三个 byte
字段中。如果您将字段(或多个字段)设为私有,仅提供对状态的访问,您可以稍后更改您的实现。如果您使用 public 字段,您的存储详细信息将成为 class 的 API 的一部分,并且在不破坏兼容性的情况下无法更改。
如何 你的 class 存储状态应该是一个实现细节,为了将来的灵活性而对外界隐藏。
(这不仅仅是理论上的问题。例如,在我的 .NET Noda Time 项目中,我的 v2.0 版本将从根本上改变日期和时间的存储细节。如果我' d 使状态可用作字段,这将是一个很大的破坏性更改。由于我使用的是属性,因此除了提高性能之外,此更改对用户是完全透明的。)
我不确定 "later release" 部分,但是保持变量私有变得很重要,特别是在 List
这样的(可能)可变属性的情况下。虽然您不能将引用重新分配给新列表,但如果列表是 public.
,您始终可以在列表中添加或删除元素
Effective Java 中的第 15 项声明建议使用私有最终字段,而不是不可变对象中的 public 最终字段,因为它可能 阻止更改内部表示以后的版本.
我无法理解突出显示的部分 - 我看不到更改访问说明符可能导致问题的情况,因为它已经是最终的。有人可以为此提供示例吗?
这不仅仅是更改访问说明符的问题 - 您可能会更改有关内部表示的一切。
假设您有三个 byte
值作为对象状态的一部分。您 可以 将它们存储在一个 int
字段中,或者您可以将它们存储在三个 byte
字段中。如果您将字段(或多个字段)设为私有,仅提供对状态的访问,您可以稍后更改您的实现。如果您使用 public 字段,您的存储详细信息将成为 class 的 API 的一部分,并且在不破坏兼容性的情况下无法更改。
如何 你的 class 存储状态应该是一个实现细节,为了将来的灵活性而对外界隐藏。
(这不仅仅是理论上的问题。例如,在我的 .NET Noda Time 项目中,我的 v2.0 版本将从根本上改变日期和时间的存储细节。如果我' d 使状态可用作字段,这将是一个很大的破坏性更改。由于我使用的是属性,因此除了提高性能之外,此更改对用户是完全透明的。)
我不确定 "later release" 部分,但是保持变量私有变得很重要,特别是在 List
这样的(可能)可变属性的情况下。虽然您不能将引用重新分配给新列表,但如果列表是 public.