J bloch使用的“失败原子性”是什么,它在不可变对象方面有何益处?

2022-09-01 10:47:49

只是遇到下面的声明作为好处immutable object

不可变对象总是具有“失败原子性”(Joshua Bloch使用的一个术语):如果一个不可变对象抛出异常,它永远不会处于不希望或不确定的状态。

任何人都可以更详细地解释它,为什么会这样?


答案 1

布洛赫的“失败原子性”意味着,如果一个方法抛出了一个异常,那么这个对象在以后应该仍然可用。通常,对象应处于调用方法之前的状态。

在不可变对象的情况下,您只需从它是不可变的事实中获得它。没有更改对象状态的操作。对象的所有方法都可以创建从原始对象派生的新对象。

例如,具有一个方法。它不会更改原始字符串中的任何内容 - 它会创建一个新对象,其内容是所需原始字符串部分的副本。如果它引发异常,那么您根本无法获得新对象 - 但原始字符串从未更改过。内部没有修改原始代码的代码,因此,它是失败原子的。Stringsubstring(int)substring()String

可变对象也可以获得失败原子性,但是你必须特别注意它,而在不可变对象中,它只是遵循你设计的不可变的注意。


答案 2