什么是J bloch使用的“失败primefaces性”以及它对不可变对象的益处?

刚刚看到下面的声明作为immutable object好处

不可变对象总是具有“失败primefaces性”(Joshua Bloch使用的术语):如果不可变对象抛出exception,它永远不会处于不合需要或不确定状态。

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

Bloch的“失败primefaces性”意味着如果某个方法抛出exception,该对象之后仍然可以使用。 通常,对象应处于调用方法之前的状态。

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

例如, String有一个substring(int)方法。 它不会更改原始字符串中的任何内容 – 它会创建一个新对象,其内容是您想要的原始字符串部分的副本。 如果它抛出exception,那么你根本就不会得到新对象 – 但是原始的String从未被更改过。 substring()没有修改原始String ,因此它是失败primefaces的。

对于可变对象也可以获得失败的primefaces性,但是你必须特别注意它,而在不可变对象中,它只是从你所采取的设计它是不可变的。