타입 안전 이종 컨테이너(Type-safe heterogeneous container) : 다양한 타입의 요소를 안전하게 저장하고 검색할 수 있는 컨테이너. 이를 통해 다양한 타입의 데이터를 일관된 방식으로 처리할 수 있다. 이러한 컨테이너를 고려함으로써 프로그램의 유연성과 안정성을 향상시킬 수 있다.
import java.util.HashMap;
import java.util.Map;
// 데이터베이스의 행을 표현하는 클래스
public class DatabaseRow {
// 열(Column)과 해당 열의 값을 저장하는 맵
// 타입 안전 이종컨테이너
private final Map<Column<?>, Object> columns = new HashMap<>();
// 열과 해당하는 값을 추가하는 메서드
public <T> void addColumn(Column<T> column, T value) {
columns.put(column, value);
}
// 열에 해당하는 값을 반환하는 메서드
public <T> T getValue(Column<T> column) {
// 맵에서 열에 해당하는 값을 가져와 형변환하여 반환
return column.getType().cast(columns.get(column));
}
}
// 열(Column)을 나타내는 클래스
class Column<T> {
// 열의 값의 타입을 나타내는 클래스
private final Class<T> type;
// 열의 값의 타입을 받아 초기화하는 생성자
public Column(Class<T> type) {
this.type = type;
}
// 열의 값의 타입을 반환하는 메서드
public Class<T> getType() {
return type;
}
}
결론 : 컬렉션 API로 대표되는 일반적인 제네릭 형태에서는 한 컨테이너가 다룰 수 있는 타입 매개변수의 수가 고정되어 있다. 하지만 컨테이너 자체가 아닌 키를 타입 매개변수로 바꾸면 이런 제약이 없는 타입 안전 이종 컨테이너를 만들 수 있다. 타입 안전 이종 컨테이너는 Class를 키로 쓰며, 이런 식으로 쓰인 Class 객체를 타입 토큰이라 한다. 또한, 직접 구현한 키 타입도 쓸 수 있다. 예컨대 데이터베이스의 행(컨테이너)을 표현한 DateabaseRow 타입에는 제네릭 타입인 Column<T>를 키로 사용할 수 있다.
'이펙티브 자바' 카테고리의 다른 글
[이펙티브 자바] 아이템 35. ordinal 메서드 대신 인스턴스 필드를 사용하라 (0) | 2024.04.05 |
---|---|
[이펙티브 자바] 아이템 34. int 상수 대신 열거 타입을 사용하라 (0) | 2024.04.04 |
[이펙티브 자바] 아이템 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) | 2024.04.01 |
[이펙티브 자바] 아이템 31. 한정적 와일드카드를 사용해 API 유연성을 높여라 (0) | 2024.04.01 |
[이펙티브 자바] 아이템 30. 이왕이면 제네릭 메서드로 만들라 (0) | 2024.04.01 |