刚刚发现以下声明作为利益 immutable
object
不可变对象总是具有“失败原子性”(一个用于的术语) Joshua Bloch): 如果一个不可变对象抛出一个异常,它就永远不会留下来 不受欢迎或不确定的状态。
任何人都可以更详细地解释它,为什么会这样呢?
刚刚发现以下声明作为利益 immutable
object
不可变对象总是具有“失败原子性”(一个用于的术语) Joshua Bloch): 如果一个不可变对象抛出一个异常,它就永远不会留下来 不受欢迎或不确定的状态。
任何人都可以更详细地解释它,为什么会这样呢?
Bloch的“失败原子性”意味着如果某个方法抛出异常,该对象之后仍然可以使用。通常,对象应处于调用方法之前的状态。
在一个不可变对象的情况下,你只是从它不可变的事实中获得。没有任何操作可以更改对象的状态。对象的所有方法可以做的是创建从原始对象派生的新对象。
例如, String
有一个 substring(int)
方法。它不会更改原始字符串中的任何内容 - 它会创建一个新对象,其内容是您想要的原始字符串部分的副本。如果它抛出异常,那么你根本就不会得到新对象 - 但是原始的String从未被更改过。里面没有代码 substring()
修改原件 String
因此,它是失败原子的。
对于可变对象也可以获得失败的原子性,但是你必须特别注意它,而在不可变对象中,它只是从你所采取的设计它是不可变的。