«Атомарность отказа» Блоха означает, что если метод выдал исключение, объект все еще можно использовать после этого. Как правило, объект должен находиться в том же состоянии, что и до вызова метода.
В случае неизменяемого объекта вы получаете это просто потому, что он неизменяемый. Нет операции, которая изменяет состояние объекта. Все методы объекта могут создавать новые объекты, производные от исходного объекта.
Например, у String
есть метод substring(int)
. Он ничего не меняет в исходной строке — он создает новый объект, содержимое которого является копией той части исходной строки, которую вы хотели. Если он выдает исключение, вы просто не получите новый объект, но исходная строка никогда не менялась. Внутри substring()
нет кода, который бы модифицировал исходный String
, поэтому он является атомарным с ошибкой.
Атомарность отказов может быть достигнута и для изменяемых объектов, но тогда вы должны уделять ей особое внимание, в то время как в неизменяемых объектах это просто следует из того, насколько тщательно вы приложили усилия, чтобы сделать их неизменяемыми.
person
RealSkeptic
schedule
24.04.2015