【问题标题】:private final vs public final fields in immutable objects (java)不可变对象中的私有最终与公共最终字段(java)
【发布时间】:2015-01-17 11:18:22
【问题描述】:

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

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

【问题讨论】:

    标签: java private immutability final public


    【解决方案1】:

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

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

    如何你的类存储状态应该是一个实现细节,为了未来的灵活性而对外界隐藏。

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

    【讨论】:

    • javamex.com/tutorials/synchronization_final.shtml 表示使用 final 会使对象在完全构造之前对其他线程不可见。如果我以后要添加并发,这可以成为兼容性的另一部分吗?
    • @huseyintugrulbuyukisik:设计类型时需要考虑并发性,但我认为这与这个问题完全不同。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 2010-11-27
      • 2015-08-01
      相关资源
      最近更新 更多