Что такое "атомарность отказа", используемая J bloch, и как ее выгодно с точки зрения неизменяемого объекта?

просто натолкнулся на приведенный ниже оператор в качестве преимущества immutable object

Неизменяемый объект всегда имеет "атомарность отказа" (термин, используемый Джошуа Блох):     если неизменный объект выдает исключение, его никогда не оставляют в     нежелательное или неопределенное состояние.

может ли кто-нибудь объяснить это более подробно и почему это так?

Ответ 1

Блох "Атоматичность отказа" означает, что если метод бросил исключение, объект должен по-прежнему использоваться впоследствии. Как правило, объект должен находиться в том же состоянии, что и перед вызовом метода.

В случае неизменяемого объекта вы получаете это просто из-за того, что он неизменен. Нет операции, которая изменяет состояние объекта. Все методы объекта могут создавать новые объекты, которые производятся от исходного объекта.

Например, String имеет метод substring(int). Он ничего не меняет в исходной строке - он создает новый объект, содержимое которого является копией части оригинальной строки, которую вы хотели. Если он выдает исключение, то вы просто не получите новый объект, но исходная строка никогда не изменялась. Внутри substring() отсутствует код, который изменяет исходный String, и поэтому он является атомом с ошибкой.

Атоматичность отказов может быть получена и для изменяемых объектов, но тогда вы должны обратить на нее особое внимание, тогда как в неизменяемых объектах это просто следует из осторожности, которую вы приняли, чтобы создать ее неизменяемую.