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