jojoldu님의 블로그 글을 참고하여 일부 재작성함.
컬렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 한다.
일급 컬렉션 예
public class Position {
private final Map<String, String> positions;
public Position(Map<String, String> positions) {
this.positions = positions;
}
}
@Test
void test() {
Map<String, String> carPositionMap = new HashMap<>();
map.put("1", "A");
map.put("2", "B");
Position carPosition = new Position(carPositionMap); // 이후로 carPosition의 positions는 불변이 유지된다.
}
Wrapping으로 인해 얻는 것
- 비즈니스에 종속적인 자료구조
- Collection의 불변성
- 생성자를 통해 Collection을 생성하고 이후 컬렉션 변경 기능을 하는 메소드를 만들지 않는다.
- 이로 인해 positions는 final이기 때문에 재할당이 불가능 하고 put을 할 수 없기 때문에 내부 값의 변경이 불가능하다.
- 상태와 행위를 한 곳에서 관리 (!!)
- 클래스 내부에 각각 목적에 맞는 로직을 갖게 된다.
- 이름을 지어줄 수 있다.
- 변수명이 아닌 클래스를 만들게되면
final이 불변이 아닌 재할당 불가임을 보여주는 예
final Map<String, String> map = new HashMap<>();
map.put("1", "asd"); // final 이지만 객체가 변한다.
System.out.println(map.get("1")); // asd가 출력된다.
map = new HashMap<>(); // 컴파일 단계에서 에러가 발생한다.