본문 바로가기
공부/이펙티브자바

[이펙티브자바]item 17.변경 가능성을 최소화하라

by 띵커베르 2023. 1. 31.
728x90
  • 불변 클래스를 쓰면 좋은점은?
    • 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다
  • 클래스를 불변으로 만들려면 다음 다섯 가지 규칙을 따른다.
    • 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다
      • setter 를 열지 않는다.
    • 클래스를 확장할 수 없도록 한다.
      • final 로 상속을 막자
    • 모든 필드를 final 로 선언한다.
    • 모든 필드를 private 로 선언한다.
    • 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.
      • 클래스 내부에 가변 객체가 있다면 접근할 수 없도록 하고, 혹시라도 접근을 허용한다면 방어적 복사를 통해 제공해주오, 실수를 하더라도 원본은 그대로로 유지하도록 하자.
  • 불변 클래스의 장점
    • 함수형 프로그래밍에 적합
    • 불편객체는 단순하고, 스레드 안전하며 따로 동기화할 필요가 없다.
    • 불변 객체까리는 내부 데이터를 공유할 수 있다.
      • 공유 해봤자 변경할 수 없기에..
    • 실패 원자성을 제공한다
  • 단점
    • 값이 다르다면 반드시 별도의 객체로 만들어야 한다.
      • 다단계 연산들을 예측하여 제공한다.
        • 여러 메서드를 묶어서 한번에 제공한다.
      • 가변동반 클래스를 제공하여 대처할 수 있다.
        • ex)String 자체는 불변이지만, 관련있는 연산이 있을경우 StringBuilder 를 이용할 수 있다.
  • 상속을 막을 수 있는 또 다른 방법
  • 가장 쉬운 방법은 final 이지만 private 생성자로 만든 후 public 정적 팩토리를 제공하자.
    • 퍄키지 바깥의 클라이언트가 바라본 이 불변 객체는 사실상 final 이다.
  • 클래스는 꼭 필요한 경우가 아니라면 불변이어야 한다.
  • 불변으로 만들수 없는 클래스라도 변경할 수 있는 부분을 최소한으로 줄이자.
  • 합당한 이유가 없다면 모든 필드는 private final 이어야 한다
728x90

댓글