[Effective Java] Item33 - 타입 안전 이종 컨테이너를 고려하라

지구🌍·2023년 3월 12일
0

Effective Java 공부

목록 보기
9/12
post-thumbnail

타입 안전 이종 컨테이너란?

💡 타입 안전 이종 컨테이너 (Type Safe Heterogeneous Container) : 여러 다른 종류들로 이루어진 값을 저장하는 타입에 안전한 객체

  • 컨테이너 대신 키를 매개변수화한 다음, 컨테이너에 값을 넣거나 뺄 때 매개변수화한 키를 함께 제공
    -> 이렇게 하면 제네릭 타입 시스템이 값의 타입이 키와 같음을 보장

사용 이유

Set<?>, Map<?, ?> 등은 특정 Type만 저장할 수 있다.
Type이 String일지 Integer일 지 모를 때 사용한다.

사용 예시

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), 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 f = new Favorites();

        f.putFavorite(String.class, "Java");
        f.putFavorite(Integer.class, 0xcafebabe);
        f.putFavorite(Class.class, Favorites.class);

        String favoriteString = f.getFavorite(String.class);
        int favoriteInteger = f.getFavorite(Integer.class);
        Class<?> favoriteClass = f.getFavorite(Class.class);

        System.out.printf("%s %x %s%n", favoriteString, favoriteInteger, favoriteClass.getName());
    }
}
  • key 타입이 Class<T> 이기 때문에, 여러 타입의 Key를 담을 수 있다.
  • Map에 넣는 것이기 때문에 null이 들어가면 안된다.
    -> Objects.requireNonNull(type)
  • cast를 하지 않으면 T가 아니라 Object가 반환된다. (Mapvalue타입이 Object이기 때문~)
  • 주어진 인수가 Class 객체가 알려주는 타입의 인스턴스인지를 검사한 다음, 맞다면 그대로 캐스팅해주고, 아니면 ClassCastException을 던진다.

제약 조건

  1. 악의적인 클라이언트가 Class객체를 타입으로 넘기면 타입안전성이 깨짐
f.putFavorite((Class) Integer.class, "hi");
int x = f.getFavorite(Integer.class);
System.out.println("x = " + x);

  1. 실체화 불가 타입에는 사용할 수 없음
f.putFavorite(List<Integer>.class, "hi");

🎈귀중한 참고자료🎈
참고자료1
참고자료2

profile
일취월장 하며 성장! 중! 공부한 것을 기록하자(^∀^●)ノシ

0개의 댓글