不可变对象中的私有final与公共final字段(java)

不可变对象中的私有final与公共final字段(java),java,private,immutability,final,public,Java,Private,Immutability,Final,Public,有效Java中的第15项指出,建议在不可变对象中使用私有final字段而不是公共final字段,因为这可能会阻止在以后的版本中更改内部表示形式 我在理解突出显示的部分时遇到了问题-我看不出更改访问说明符会导致问题的情况,因为它已经是最终的。有人能举个例子吗?这不仅仅是更改访问说明符的问题,您可能会更改有关内部表示的所有内容 假设有三个byte值作为对象状态的一部分。您可以将它们存储在单个int字段中,也可以将它们存储在三个byte字段中。如果将字段(或多个字段)保持为私有,仅提供对状态的访问,则

有效Java中的第15项指出,建议在不可变对象中使用私有final字段而不是公共final字段,因为这可能会阻止在以后的版本中更改内部表示形式


我在理解突出显示的部分时遇到了问题-我看不出更改访问说明符会导致问题的情况,因为它已经是最终的。有人能举个例子吗?

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

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

您的类如何存储状态应该是一个实现细节,对外部世界隐藏以实现未来的灵活性


(这不仅仅是一个理论上的问题。例如,在我的.NET项目中,我的v2.0版本将彻底更改日期和时间的存储详细信息。如果我将状态作为字段提供,这将是一个巨大的突破性更改。由于我使用了属性,此更改对用户完全透明,而不是改进

我不确定“稍后发布”部分,但保持变量私有化变得非常重要,特别是在(可能的)情况下易变属性,如
List
。虽然您不能重新分配对新列表的引用,但如果列表是公共的,您始终可以从列表中添加或删除元素。

说,使用final会使其他线程在完全构建之前看不到对象。如果我稍后准备添加并发性,这是否会成为兼容性的另一部分?@huseyintugrulbuyukisik:当你设计一个类型的时候,你需要考虑并发性,但是我认为这和这个问题是完全不同的。