缺少Java中的不可变对象?

par*_*rkr 32 java immutability

Java中不可变对象的优点似乎很清楚:

  • 一致的状态
  • 自动螺纹安全
  • 简单

您可以通过使用私有final字段和构造函数注入来支持不变性.

但是,在Java中支持不可变对象的缺点是什么?

  • 与ORM或Web演示工具不兼容?
  • 设计不灵活?
  • 实施复杂性?

是否有可能设计一个主要使用不可变对象的大规模系统(深层对象图)?

dfa*_*dfa 19

但是,在Java中支持不可变对象的缺点是什么?与ORM或Web演示工具不兼容?

基于反射的框架由于不可变对象而变得复杂,因为它们需要构造函数注入:

  • Java中没有默认参数,这迫使我们总是提供所有必需的依赖项
  • 构造函数覆盖可能是凌乱的
  • 构造函数参数名称通常不能通过反射获得,这迫使我们依赖于参数顺序来进行依赖项解析

实施复杂性?

创建不可变对象仍然是一项无聊的任务; 编译器应该处理实现细节,就像在groovy中一样

是否有可能设计一个主要使用不可变对象的大规模系统(深层对象图)?

肯定是的; 不可变对象为其他对象构建了很好的构建块(它们支持组合),因为当你可以依赖它的不可变组件时,维护复杂对象的不变量要容易得多.对我来说唯一真正的缺点是创建了许多临时对象(例如,String concat过去是一个问题).


And*_*eiM 15

通过不变性,只要您需要修改数据,就需要创建一个新对象.这可能很昂贵.

想象一下,需要在消耗几兆内存的对象中修改一个位:你需要实例化一个全新的对象,分配内存等.如果你需要多次这样做,可变性变得非常有吸引力.

  • 由于可变性而进行的防御性复制也可能导致此问题. (10认同)
  • 有算法.在我的桌面上打开的是"Purely Functional Data Structures"的副本.值得一读. (6认同)