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

только что наткнулся на заявление ниже в пользу immutable object

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

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


person Bhargav Modi    schedule 24.04.2015    source источник


Ответы (1)


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

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

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

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

person RealSkeptic    schedule 24.04.2015
comment
Очень хорошо объясненный ответ с прекрасным примером метода subString String. - person Nisarg Patil; 20.11.2018