[이펙티브 자바]17. 변경 가능성 최소화하기(Immutable Class)

Wintering·2022년 5월 30일
0

이펙티브 자바

목록 보기
13/18

불변클래스

  • 인스턴스의 내부 값을 수정할 수 없는 클래스 . 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 달라지지 않는다.

  • ex. String, 기본 타입의 Boxing 클래스, BigInteger, BigDecimal 등

  • 불변 클래스는 실제로 가변 클래스에 비해 실제로 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다.

  • 불변 객체는 생성된 시점의 상태를 파괴될 때 까지 그대로 간직.
    모든 생성자가 불변이라면, 클래스를 사용하는 프로그래머가 다른 노력을 들일 필요가 없어진다.
    반면 가면 객체는 임의의 복잡한 상황에 놓일 수 있으므로, 믿고 사용하기 어려울 수 있다.

  • 불변 객체는 근본적으로 스레드에 안전! > 여러 스레드를 동시에 사용해도 절대 훼손되지 않기 때문에 안심하고 공유할 수 있다. > 한번 만든 인스턴스를 최대한 재활용한다. 이 때 중복이 되지 않도록 정적팩토리르 사용!

클래스를 불변으로 만들기 위한 5가지 규칙

1. 객체의 상태를 변경하는 메서드를 제공하지 않는다.
2. 클래스를 확장할 수 없도록한다.
	ex. 상속을 막기위해 클래스를 final로 선언한다.
3. 모든 필드를 final로 선언한다.
	(시스템이 강제하는 수단을 사용하여, 설계 의도를 명확히 드러낸다)
4. 모든 필드를 private으로 선언한다.
	필드를 참조하는 가변객체를 클라이언트에서 직접 접근하여 수정하는 일을 막는다. 
5. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 
	클래스에서 가변객체를 참조하는 필드가 하나라도 있다면 클라이언트에서는 
	그 객체의 참조를 얻을 수 없도록 설계한다. 
	생성자, 접근자, readObject 메소드에서 모두 방어적 복사를 수행한다.


클래스는 꼭 필요한 경우가 아니라면 불변이어야한다.
다른 합당한 이유가 없다면 모든 필드는 private final 이어야한다.
생성자는 불변식 설정이 모두 완료된, 초기화가 완벽히 끝난 상태의 객체를 생성해야한다

0개의 댓글