是否强迫将字段作为最终使类不可变

时间:2014-08-30 16:19:32

标签: java immutability

我怀疑制作一个不可变的课程。

根据java docs。

  1. 我让班级决赛(没人可以延长)
  2. 字段是私有的。
  3. 没有setter功能。
  4. 如果字段是可变的,则发送该字段的克隆副本。
  5. 我怀疑是否必须将我的班级列为final

3 个答案:

答案 0 :(得分:3)

如果没有setter方法(并且可能没有其他方法影响字段的值)并且字段本身为private,则将它们标记为final有点多余。 话虽如此 - 它是一个很好的防守实践,许多项目的标准都遵循。

答案 1 :(得分:2)

虽然很多人说这不是必须将字段标记为final,但我会说至少在一个案例中我可以想到你需要将字段标记为final,如果你想创建你的不可变类就是这种情况线程安全。

根据Java内存模型: -

当构造函数完成时,会认为对象已完全初始化。在该对象完全初始化之后只能看到对象引用的线程可以保证看到该对象的最终字段的正确初始化值。

JLS final thread safety

因此,如果你有一个带有实例变量的不可变类,你在构造函数中初始化为非最终变量,那么就不能保证线程安全,因为对非最终变量的写入可能对其他线程不可见,即使构造函数有完全运行(注意重新创建这个非常困难,因为这可能发生在高度并发的应用程序中)

答案 2 :(得分:0)

不可变=不可更改。因此,使属性最终是一个好主意。如果没有保护对象的所有属性都不被改变,我就不会说该对象是不可变的。

但如果一个对象没有为它的私有属性提供任何setter,那么它也是不可变的。

immutable对象永远不会改变,但它引用的任何内容都可能会改变。 Deep immutability要强得多:基础对象和可以从中导航到的任何对象都不会改变。