책/이펙티브 자바 3e
아이템17) 변경 가능성을 최소화하라
jhg0406
2022. 3. 5. 13:44
클래스를 불변으로 만드려면 다음 다섯가지 규칙을 따르면 된다.
- 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다.
- 클래스를 확장할 수 없도록 한다.
final을 사용하거나 모든 생성자를 private 혹은 package-private으로 만들고 public 정적 팩터리를 제공 - 모든 필드를 final로 선언한다.
- 모든 필드를 private으로 선언한다.
- 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.
불변 객체의 장점
- 불변 객체는 단순
시작부터 끝까지 동일함 - 불변 객체는 근본적으로 스레드 안전하여 따로 동기화할 필요가 없다.
여러 스레드가 동시에 사용해도 절대 훼손되지 않음 - 불변 객체는 자유롭게 공유할 수 있고, 불변 객체끼리는 내부 데이터를 공유할 수 있다.
값이 변하지 않으니 공유를 해도 문제가 없음 - 객체를 만들 때 다른 불변 객체들을 구성요소로 사용하면 이점이 많다.
예를들어 맵이나 집합의 구성요소로 이용하면 불변식이 허물어지는 걱정이 없다. - 불변 객체는 그 자체로 실패 원자성을 제공한다.
(실패원자성: 메서드에서 예외가 발생한 후에도 그 객체는 여전히 호출 전과 똑같은 상태여야 한다.)
불변 객체의 단점
- 값이 다르면 독립된 객체로 만들어야 함
정리
- getter가 있다고 무조건 setter를 쓰지말자
- 클래스는 꼭 필요한 경우가 아니라면 불변이어야 한다.
- 불변으로 만들 수 없는 클래스라도 변경할 수 있는 부분을 최소한으로 줄이자.
- 다른 합당한 이유가 없다면 모든 필드는 private final이어야 한다.
- 생성자는 불변식 설정이 모두 완료된, 초기화가 완벽히 끝난 상태의 객체를 생성해야 한다.