J bloch 使用的 "failure atomicity" 是什么,它对不可变对象有何好处?
what is "failure atomicity" used by J bloch and how its beneficial in terms of immutable object?
刚刚看到下面的声明是 immutable
object
的好处
Immutable object always have “failure atomicity” (a term used by
Joshua Bloch) :
if an immutable object throws an exception, it’s never left in
an undesirable or indeterminate state.
谁能更详细地解释一下,为什么会这样?
Bloch 的 "Failure atomicity" 意味着如果一个方法抛出异常,该对象之后应该仍然可用。通常,对象应处于与调用该方法之前相同的状态。
在不可变对象的情况下,您可以简单地从它不可变的事实中获得这一点。没有更改对象状态的操作。对象的所有方法可能做的就是创建从原始对象派生的新对象。
例如,String
有一个 substring(int)
方法。它不会更改原始字符串中的任何内容 - 它会创建一个新对象,其内容是您想要的原始字符串部分的副本。如果它抛出异常,那么您根本就不会获得新对象——但原始 String 从未更改过。 substring()
中没有修改原始 String
的代码,因此它是失败原子的。
可变对象也可以获得失败原子性,但是你必须特别注意它,而在不可变对象中,它只是由于你将其设计为不可变而引起的。
刚刚看到下面的声明是 immutable
object
Immutable object always have “failure atomicity” (a term used by Joshua Bloch) : if an immutable object throws an exception, it’s never left in an undesirable or indeterminate state.
谁能更详细地解释一下,为什么会这样?
Bloch 的 "Failure atomicity" 意味着如果一个方法抛出异常,该对象之后应该仍然可用。通常,对象应处于与调用该方法之前相同的状态。
在不可变对象的情况下,您可以简单地从它不可变的事实中获得这一点。没有更改对象状态的操作。对象的所有方法可能做的就是创建从原始对象派生的新对象。
例如,String
有一个 substring(int)
方法。它不会更改原始字符串中的任何内容 - 它会创建一个新对象,其内容是您想要的原始字符串部分的副本。如果它抛出异常,那么您根本就不会获得新对象——但原始 String 从未更改过。 substring()
中没有修改原始 String
的代码,因此它是失败原子的。
可变对象也可以获得失败原子性,但是你必须特别注意它,而在不可变对象中,它只是由于你将其设计为不可变而引起的。