"Niepowodzenie awarii" Blocha oznacza, że jeśli metoda wyrzuci wyjątek, obiekt powinien być nadal możliwy do wykorzystania. Zasadniczo obiekt powinien znajdować się w tym samym stanie, w jakim znajdował się przed wywołaniem metody.
W przypadku obiektu niezmiennego zyskuje się to po prostu dlatego, że jest niezmienny. Nie ma operacji, która zmienia stan obiektu. Wszystkie metody obiektu mogą zrobić, to tworzyć nowe obiekty, które pochodzą z oryginalnego obiektu.
Na przykład String
ma metodę substring(int)
. Nie zmienia niczego w oryginalnym łańcuchu - tworzy nowy obiekt, którego treść jest kopią części oryginalnego łańcucha, który chciałeś. Jeśli zgłasza wyjątek, to po prostu nie otrzymasz nowego obiektu - ale oryginalny Ciąg nigdy się nie zmienił. W kodzie substring()
nie ma kodu, który modyfikuje oryginalny kod String
, a zatem jest niepodzielny.
Atomowość porażenia można uzyskać również w przypadku obiektów zmiennych, ale należy zwrócić na to szczególną uwagę, podczas gdy w obiektach niezmiennych wynika to po prostu z troski, którą zaprojektowałeś, aby była niezmienna.