코딩하는 털보

ITEM 33 타입 안전 이종 컨테이너 본문

Book/이펙티브 자바

ITEM 33 타입 안전 이종 컨테이너

이정인 2025. 4. 21. 22:25
package me.rockintuna.effectivejava.item;

import org.springframework.core.ParameterizedTypeReference;

import java.util.HashMap;
import java.util.Map;

/*
타입 안전 이종 컨테이너를 고려하라
 */
public class Item33 {
    /*
    하나의 컨테이너(제네릭 인스턴스)에서 여러 매개변수화 타입을 쓰려면?
*/
    public static void main(String[] args) {
        //String.class 리터럴의 타입은 Class<String>
        assert String.class instanceof Class<String>;

        Favorites favorites = new Favorites();
        favorites.putFavorite(String.class, "A");
    }

    /*
    타입 안전 이종 컨테이너 패턴 :
    컨테이너 대신 키를 매개변수화(Class<T>)하고
    컨테이너에 값을 넣거나 뺄 때 매개변수화한 키를 함께 제공(타입 토큰이라고 함)하는 방식
     */
    static class Favorites {
        private Map<Class<?>, Object> favorites = new HashMap<>();

        public <T> void putFavorite(Class<T> key, T value) {
            favorites.put(key, value);
        }

        public <T> T getFavorite(Class<T> key) {
            /*
            아래와 같이 비검사 형변환 하는 것 보다
            return (T) favorites.get(key);

            Class cast(Object obj) 메서드를 사용하면 타입 안전하다.
             */
            return key.cast(favorites.get(key));
        }
    }
    /*
    타입 안전 이종 컨테이너 패턴의 예시인 Favorites,
    모든 키의 타입이 제각각이라 여러 가지 타입의 원소를 담을 수 있다.

    타입 안전 이종 컨테이너의 한계
    1. key에 Class 로 타입을 입력하면 타입 안정성이 깨진다.
    2. List<String>.class는 문법 오류인 것 처럼 실체화 불가 타입에는 사용할 수 없다.
    (2번 문제는 ParameterizedTypeReference(슈퍼 타입 토큰)를 사용하면 해결할 수 있다, 완벽하지는 않음)
     */
}


Comments