하나의 콜렉션을 유일한 필드 변수로 갖고 있는 클래스.
'객체지향 생활체조 규칙 8 - 일급 콜렉션 사용'
대표적인 예로, 생성 시에 필요한 검증 로직들을 비즈니스 로직을 담당하는 서비스에서 옮겨갈 수 있다. 서비스단에서 그 검증 로직 다 찾아보고 왜 검증해야 하는지 알아내는 것보다, 한 클래스 내에서 확인할 수 있다면? 아니면 그 로직을 알 필요가 없다면? 일급 컬렉션의 강점이 나타나게 되는 것이다.
public class LottoService {
public void createNumber() {
List<Long> lottoNumbers = createNonDuplicateNumbers();
validateSize(lottoNumbers);
validateDuplicate(lottoNumbers);
// ....
}
}
public class LottoNumbers {
private List<Long> lottoNumbers;
public LottoNumbers(List<Long> lottoNumbers) {
validateSize(lottoNumbers);
validateDuplicate(lottoNumbers);
this.lottoNumbers = lottoNumbers;
}
}
일급 컬렉션을 필요한 조건을 충족하는 새로운 자료구조를 만든다고 생각하면 된다.
후배들이 클래스가 무엇인지 설명해달라고 할 때, 너가 원하는 타입을 만든다고 생각하면 된다고 해준다.
원하는 값을 담는(필드 변수), 필요한 기능을 갖고 있는(메서드) 타입을 만드는 거니까.
그것과 동일하게 새로운 자료구조를 만든다고 생각하면 될 것 같다.
대신 필드가 컬렉션 하나인 것이 차이점이겠다.
그냥 클래스를 생성할 시에, 필드에 접근을 불가능하게 만들면 된다.
필드의 접근제어자를 private로 설정하고, 변경하는 로직을 전혀 만들지 않으면 끝.
가능하다는 거지, 꼭 그렇다는 것은 아니다.
값을 변경하고 싶으면 아예 새로운 객체를 만들어서 반환해도 된다.
굳이 설명을 담지는 않겠다. 위에서 언급한 것을 읽으면 당연시된다.
일급 컬렉션 이니까 이름이 있는 커스텀된 컬렉션이 된다. 의미를 컬렉션 명에 담을 수 있다.