4장_아이템17 - ririkat/effective-java GitHub Wiki

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

  • 불변 클래스 : 인스턴스의 내부 값을 수정할 수 없는 클래스

  • 불변 클래스 생성 규칙

    1. 객체의 상태를 변경하는 메서드를 제공하지 않는다.
    2. 클래스를 확장할 수 없도록 한다.
    3. 모든 필드를 final로 선언한다.
    4. 모든 필드를 private으로 선언한다.
    5. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.
  • 불변 객체의 장점

    • 생성된 시점의 상태를 파괴될 때까지 그대로 간직함.
    • 스레드 안전하여 자유롭게 공유 가능
    • 불변 객체끼리 내부 데이터 공유 가능
    • 실패 원자성을 제공
  • 불변 객체의 단점

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

      ⇒ 원하는 객체를 완성하기까지의 단계가 많고, 그 중간 단계에서 만들어진 객체들이 모두 버려지면 성능 문제가 발생할 수 있음.

    • 대처 방법

      • 다단계 연산을 예측하여 기본 기능으로 제공
  • 불변 객체 생성 추가 설계 방법

    • 모든 생성자를 private 혹은 package-private으로 만들고 public 정적 팩터리로 제공하는 방법

핵심 정리

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