Java:如何处理"几乎"不可变的数据结构?

Pet*_*ete 4 java concurrency builder immutability

不可变对象很棒,因为它们在多线程应用程序中不需要特别小心或提供.然而,许多物体不能自然地变化.例如,一旦订单被填写,就会提交,处理并分配一个永久ID的订单.创建和提交订单时无法提供ID,但稍后(或可能永远不会)到达.

可能的解决方案:

  1. 在创建订单时分配其他唯一ID.然后,当永久(订单填充)ID到来时,将其存储在Map中.所以订单类是不可变的.然后,如果Map键不存在,我们就知道订单还没有填写.(Map应该是静态类字段吗?)
  2. 另一种解决方案是使永久ID字段可变,并应用适当的同步.此外,我们可以限制ID在对象的生命周期中只设置一次.

这些解决方案合理吗?还有其他想法吗?谢谢.

Col*_*inD 9

使类不可变并null为ID 创建有效值.当您有要分配的ID时,将现有的不可变对象替换为相同的新对象,除了它具有新ID而不是旧ID.我喜欢使用withX这个purose的方法.

Foo foo = new Foo("bar");
...
foo = foo.withId(12345); // replace foo with new derived object
Run Code Online (Sandbox Code Playgroud)

  • 问题是找到所有对"旧"Foo的引用,用带有ID的"新"版本替换它们. (2认同)
  • @Stephen C:这只是意味着你必须小心控制引用的位置和不保留的位置.您经常需要通知应用程序的某些部分实例已更改. (2认同)