가능한 한 실패 원자적으로 만들라
호출된 메서드가 실패 하더라도 객체는 메서드 호출 전 상태를 유지해야 한다. 이러한 특성을 실패 원자적(failure atomic) 이라고 표현한다.
메서드를 실패 원자적으로 만드는 방법.
1️⃣ 불변 객체로 설계하자.
불변객체는 태생적으로 실패 원자적이다.
메서드가 실패하면 새로운 객체로 만들어지지 않을 수 있으나 기존 객체가 불안정한 상태에 빠지는 일은 없다.
String 클래스의 subString 메서드를 살펴보면 실패 원자적으로 만들어져 있습니다.
기존 객체가 불안정한 상태에 빠지지 않는다.
시작 인덱스가 0보다 작거나, 시작 인덱스가 끝 인덱스보다 크거나, 끝 인덱스가 현재 문자 길이보다 긴 경우에는 예외가 발생한다.
2️⃣ 매개변수의 유효성을 검사하자.
객체의 내부 상태를 변경하기 전에 잠재적 예외의 가능성을 대부분 걸러낼 수 있다.
아래는 stack의 pop 메서드이다. 코드를 보면 작업을 수행하기 전 index가 현재 원소의 수를 비교하는 작업을 진행하여 검사를 하고 있다.
실패할 가능성이 있는 모든 코드를 객체의 상태를 바꾸는 코드보다 앞에 배치하는 방법도 존재한다.
로직을 수정하기 전에 인수의 유효성을 검사하기 어려울 때 사용할 수 있으며 TreeMap을 예로 들어 잘못된 타입의 원소를 추가할 때 트리를 변경하기에 앞서 해당 원소가 들어갈 위치를 찾는 과정에서 ClassCastException을 던질 것이다.