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