책/이펙티브 자바 3e

아이템17) 변경 가능성을 최소화하라

jhg0406 2022. 3. 5. 13:44

클래스를 불변으로 만드려면 다음 다섯가지 규칙을 따르면 된다.

  • 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다.
  • 클래스를 확장할 수 없도록 한다.
    final을 사용하거나 모든 생성자를 private 혹은 package-private으로 만들고 public 정적 팩터리를 제공
  • 모든 필드를 final로 선언한다.
  • 모든 필드를 private으로 선언한다.
  • 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.

불변 객체의 장점

  • 불변 객체는 단순
    시작부터 끝까지 동일함
  • 불변 객체는 근본적으로 스레드 안전하여 따로 동기화할 필요가 없다.
    여러 스레드가 동시에 사용해도 절대 훼손되지 않음
  • 불변 객체는 자유롭게 공유할 수 있고, 불변 객체끼리는 내부 데이터를 공유할 수 있다.
    값이 변하지 않으니 공유를 해도 문제가 없음
  • 객체를 만들 때 다른 불변 객체들을 구성요소로 사용하면 이점이 많다.
    예를들어 맵이나 집합의 구성요소로 이용하면 불변식이 허물어지는 걱정이 없다.
  • 불변 객체는 그 자체로 실패 원자성을 제공한다.
    (실패원자성: 메서드에서 예외가 발생한 후에도 그 객체는 여전히 호출 전과 똑같은 상태여야 한다.)

불변 객체의 단점

  • 값이 다르면 독립된 객체로 만들어야 함

정리

  • getter가 있다고 무조건 setter를 쓰지말자
  • 클래스는 꼭 필요한 경우가 아니라면 불변이어야 한다.
  • 불변으로 만들 수 없는 클래스라도 변경할 수 있는 부분을 최소한으로 줄이자.
  • 다른 합당한 이유가 없다면 모든 필드는 private final이어야 한다.
  • 생성자는 불변식 설정이 모두 완료된, 초기화가 완벽히 끝난 상태의 객체를 생성해야 한다.