불변 객체로 설계
불변 객체는 생성 시점에 고정되어 변하지 않으므로 기존 객체가 불안정한 상태에 빠지지 않음
로직을 수행하기 전에 매개변수의 유효성을 검사
객체의 내부 상태를 변경하기 전에 잠재적 예외의 가능성을 걸러내는 방법
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null; // 다 쓴 참조 해제
return result;
}
→ 예외가 발생하면 elements[size] = null 이 실행되지 않으므로 스택의 상태가 변하지 않게 됨
실패할 가능성이 있는 모든 코드를 객체의 상태를 바꾸는 코드보다 앞에 배치
객체의 임시 복사본에서 작업을 수행한 후 작업이 성공적으로 완료되면 원래 객체와 교체
→ 데이터를 임시 자료 구조에 저장해 작업하는게 더 빠를 때 적용하기 좋음
작업 도중에 발생하는 실패를 가로채는 복구 코드를 작성하여 작업 전 상태로 되돌리기
→ 주로 디스크 기반 내구성을 보장해야 하는 자료구조에서 쓰임 (자주 쓰이진 않는다)
두 스레드가 동기화 없이 같은 객체를 동시에 수행하는 경우
→ 한 스레드에서 에러를 잡아도 다른 스레드에서 작업이 일어나면 객체가 사용가능한 상태임을 확신할 수 없어 작업을 계속할 수 있음
실패 원자성을 위한 비용이 크거나 복잡도가 큰 경우도 있을 수 있음
실패 원자성을 지키지 못한다면 실패 시 객체 상태를 api설명에 명시하자