아이템 33. 타입 안전 이종 컨테이너를 고려하라

weekbelt·2022년 11월 26일
0

우리가 생각하는 컨테이너는 어떤 다른 객체를 넣을 수 있는 또다른 객체를 생각할 수 있습니다. 가령 Set, Map, Optional 이런것들이 객체를 넣을 수 있는 컨테이너라고 할 수 있는데 우리가 여태까지 사용했던 제네릭을 사용하는 방식은 아래 Favorites클래스처럼 오로지 딱 한가지 타입만을 넣을 수 있는방식이었습니다.

package me.whiteship.chapter05.item33.type_token;

import java.util.List;

public class Favorites<T> {

	private List<T> value;

    public <T> T get(Class<T> clazz) {
        return clazz.cast(this.map.get(clazz));
    }

    public static void main(String[] args) {
		Favorites<String> names = new Favorites<>();
        names.value.add("문자열")
    }
}

하지만 위와 같이 하나의 타입으로만 요소를 넣지 않고 여러가지 타입을 저장하고 싶을때 아래와 같이 Map을 참조해서 구현할 수 있습니다.

package me.whiteship.chapter05.item33.type_token;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class Favorites {

    private Map<Class<?>, Object> map = new HashMap<>();

    public <T> void put(Class<T> clazz, T value) {
        this.map.put(Objects.requireNonNull(clazz), clazz.cast(value));
    }

    public <T> T get(Class<T> clazz) {
        return clazz.cast(this.map.get(clazz));
    }

    public static void main(String[] args) {
        Favorites favorites = new Favorites();
        favorites.put(String.class, "keesun");
        favorites.put(Integer.class, 2);

//        favorites.put(List<Integer>.class, List.of(1, 2, 3));
//        favorites.put(List<String>.class, List.of("a", "b", "c"));

//        List list = favorites.get(List.class);
//        list.forEach(System.out::println);
    }

}
profile
백엔드 개발자 입니다

0개의 댓글