본문 바로가기

1_스터디

[EffectiveJava] ITEM 33. 타입 안전 이종 컨테이너를 고려하라

반응형

이종 컨테이너 패턴 (type safe heterogeneous container pattern)

제네릭은 Set<E>, Map<K, V> 등의 컬렉션과 ThreadLocal<T>, AtomicReference<T> 등의 단일원소 컨테이너도 흔히 쓰인다. 이런 모든 쓰임에서 매개변수화되는 대상은 원소가 아닌 컨테이너 자신이다. 따라서 하나의 컨테이너에서 매개변수화할 수 있는 타입의 수가 제한된다.

예를들어, Set 에는 원소의 타입을 뜻하는 단 하나의 타입 매개변수만 있으면 되며, Map 에는 key, value의 타입을 뜻하는 2개만 필요한 식이다.

더 유연한 방식이 필요할때가 있다. 데이터베이스희 행(row)은 임의 개수의 열(column)을 가질 수 있는데, 모두 열을 타입 안전하게 이용할 수 있다면 더 편할 것이다. 여기에 쉬운 해법이 있다.

컨테이너 대신 키를 매개변수화한 다음, 컨테이너에 값을 넣거나 뺄때 매개변수화한 키를 함께 제공하면 된다.

이렇게 하면 제네릭 타입 시스템이 값의 타입이 키와 같음을 보장해 줄 것이다.

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class Favorites {
    private Map<Class<?>, Object> favorites = new HashMap<>();
        public <T> void putFavorite(Class<T> type, T instance) {
                favorites.put(Objects.requireNonNull(type), type.cast(instance));
        }
        public <T> T getFavorite(Class<T> type) {
                return type.cast(favorites.get(type));
        }
}

public class Main {
    public static void main(String[] args) {
        Favorites favorites = new Favorites();

        favorites.putFavorite((Class)Integer.class, "Integer 의 인스턴스가 아닙니다.");
    }
}
반응형