java - 不可变对象(immutable对象)中的私有(private)最终字段与公共(public)最终字段(java)

标签 java private immutability final public

《Effective Java》中的第 15 条指出,建议在不可变对象(immutable对象)中使用私有(private)最终字段而不是公共(public)最终字段,因为它可能防止在以后的版本中更改内部表示

我无法理解突出显示的部分 - 我看不到更改访问说明符可能会在它已经最终确定时导致问题的情况。有人可以提供一个例子吗?

最佳答案

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

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

如何你的类存储状态应该是一个实现细节,对外界隐藏以保证 future 的灵 active 。

(这不仅仅是一个理论上的问题。例如,在我的 .NET 中的 Noda Time 项目中,我的 v2.0 版本将从根本上改变日期和时间的存储详细信息。如果我做出了状态作为字段提供,这将是一个重大的重大更改。由于我使用了属性,因此除了提高性能之外,此更改对用户来说是完全透明的。)

关于java - 不可变对象(immutable对象)中的私有(private)最终字段与公共(public)最终字段(java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27998896/

相关文章:

python - Python 和 PEP8 中的私有(private)属性

c# - 并行应用程序的可变与不可变

java - Togglz JDBCStateRepository 自动在 DB2 中创建格式错误的表

java - 如何在Java中的不同对象之间进行等待和通知?

drupal - 使内容仅对 Drupal 中的作者可见

c++ - 适当使用 friend ?容器类旨在操纵特定类型的对象

haskell - Haskell 中的不可变变量是什么意思?

perl - 如何在 Perl 和 Moose 中创建不可变对象(immutable对象)的循环图?

java - 如何计算字符串中格式字符的数量?

java - 串口输入流