불변 일급컬렉션(invariant first class collection) 정리
로또를 통해 불변하는 일급컬렉션 생성 정리
📜 제목으로 보기
불변 일급컬렉션의 장점
-
호출시 복사된 새 객체
를 제공해주니DTO처럼 view에 막 던져도 안정적이다
- 건들이고 싶어도 기존 객체는 불변이라 못건들이게 되니
- view에서도
복사된 가변 새컬렉션
을새 객체
로 넘겨주면 된다.
-
불변객체
를 map의 key로 사용하게 될 경우식별자 변경
의 문제가 발생하지 않는다.key로 사용하는 객체는 불변객체
여야한다.
-
도중에 실패하는 경우, 일부만 달라질 수 있다.
- 기존 객체는 불변을 유지하게 해줘서 그런 문제(
실패 원자성
)를 막자.
- 기존 객체는 불변을 유지하게 해줘서 그런 문제(
불변 일급컬렉션을 만드는 과정
- 멋도 모르고
컬렉션<단일객체>을 생성자에 통채로 집어넣어 만든 일급컬렉션은
사실상태 변화(setter/add 등) -> [변화된 상태의 새 객체]를 생성해서 반환
하기 위해 생겨난 생성자임을 생각해야한다.
-
단일객체에 대한 복수형으로
final 불변의 일급컬렉션 클래스
를 생성하고,Set으로 단일객체를 보유할 빈 컬렉션을 조합
한 필드를 가지고 있는다. -
필드에 대해서 setter(상태변화) / getter를 고민해야한다.
- 단일객체가
외부에서 변수로 받아져 조작되는 객체
라면, 객체 자체를 파라미터로 받는 setter로 만든다. 컬렉션에 대한 setter는 add/remve등
이다.add로 단일객체 파라미터
를 받되- 상태변화의 setter(add)는
상태변화된 새 객체를 반환
하여 불변성을 유지한다.
- 2번에서
상태변화된 컬렉션으로 새 객체 생성해서 반환
을 하기 위해컬렉션을 통째로 받아 생성하는 생성자
가 필요했음을 생각한다. - 즉, 필요에 의해 객체컬렉션을 받는 생성자가 생겼음을 인지한다.
- 단일객체가
-
컬렉션 필드의 상태변화는
기존 컬렉션필드가 변하지 않도록 사본으로 복사한 다음 상태변화
시킨 후새객체 생성
을 해줘야한다.-
컬렉션필드를 수정할 땐, 항상 사본복사후 연산
하자.- 생성자를 통한 복사는
객체요소는 같은 주소를 바라봐서 요소변화가 가능한
상태로 복사이다.
- 생성자를 통한 복사는
-
-
기본생성자외
컬렉션 필드의 생성자가 생성되는 순간, 빈컬렉션의 필드초기화
는 의미가 없어진다.최초의 시작은 빈컬렉션으로 될 수 있도록 부생성자로서 추가
해줘야한다. -
파라미터가 없는 생성자는
부생성자
이므로파라미터가 있는 주생성자를 this로 사용
해줘야한다. -
불변의 일급컬렉션에 요소를 add하는 과정은 매번 재할당해줘야한다.
-
불변 객체를 받는
변수
는 재할당이 운명이다. -
일급컬렉션은 getter().size()가 아니라
.size()
메서드를 정의해서 쓴다.
-