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

불변 클래스 예시

  • String

  • BigInteger

  • BigDecimal

  • 이외 박싱 타입들

클래스를 불변으로 만드는 5가지 규칙

  • 객체의 상태를 변경하는 메서드 ( 변경자 ) 를 제공하지 않는다.

  • 클래스를 확장할 수 없도록 한다. (fi이나 )

    • 클래스를 final로 선언하거나 생성자를 private 으로 만들고 public 정적 팩터리를 제공

  • 모든 필드를 final 로 선언한다.

  • 모든 필드를 private 으로 선언한다.

    • public final 로 해도 불변이 되지만, 다음 릴리즈에 내부 표현을 바꾸지 못함으로 private이 낫다

  • 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.

불변 클래스의 이점

  • 스레드 안전하여 따로 동기화할 필요 없고, 안심하고 공유할 수 있다

  • 자주 사용되는 인스턴스를 캐싱하여 같은 인스턴스를 중복 생성하지 않게 해주는 정적 팩터리를 제공할 수 있다.

  • 불변 객체는 자유롭게 공유할 수 있음은 물론, 불변 객체끼리는 내부 데이터를 공유할 수 있다

불변 클래스의 단점

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

    • 예 String: 불변이라 다른 값은 새로운 스트링으로

클래스는 꼭 필요한 경우가 아니라면 불변이어야 한다. 하지만, 성능 때문에 어쩔수 없다면 불변 클래스와 쌍을 이루는 가변 동반 클래스를 public 클래스로 제공하도록 하자.

불변으로 만들 수 없는 클래스라도 변경할 수 있는 부분을 최소한으로 줄이자. 다른 합당한 이유가 없다면 모든 필드는 private final 이어야 한다.

생성자는 불변식 설정이 모두 완료된, 초기화가 완벽히 끝난 상태의 객체를 생성해야 한다.

확실한 이유가 없다면 생성자와 정적 팩터리 외에는 그 어떤 초기화 메서드도 public 으로 제공해서는 안 된다

Last updated