개발하는 두더지

[Effective Java 규칙29] 형 안전 다형성 컨테이너를 쓰면 어떨지 따져보라 본문

Java,Android

[Effective Java 규칙29] 형 안전 다형성 컨테이너를 쓰면 어떨지 따져보라

덜지 2018. 10. 8. 16:49

[Effective Java 규칙29] 형 안전 다형성 컨테이너를 쓰면 어떨지 따져보라

Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다.



제네릭을 이용하여 Set이나 Map같은 컬렉션(Collections)을 만들 때 키 값을 Class 객체로 사용하면 형 안전 다형성 컨테이너를 만들 수 있다.

형 안전성을 깨뜨리지 않으면서 각 인덱스에 접근하여 서로 다른 자료형의 값을 받아올 수 있다.


예를들어, 임의 클래스 객체를 골라 저장하고 꺼낼 수 있는 클래스가 있다고 하자. 키는 Class 객체가 된다. 형인자 T가 키를 의미한다는 것을 제외하면 간단한 Map과 같아 보인다. 이 API를 사용하는 클라이언트는 객체를 넣거나 꺼낼 때 그 클래스 객체를 함께 전달하면 된다.

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

cast 메서드는 같은 자료형인 경우 값을 그대로 리턴하고, 자료형이 다를 경우 ClassCastException이 나옵니다. 즉, 키와 값이 같은 타입일 경우에만 Map에 저장됩니다.


public static void main(String[] args) {
Favorites f = new Favorites();
f.putFavorite(String.class, "JAVA");
f.putFavorite(Integer.class, 15);
f.putFavorite(Class.class, Favorites.class);

String test1 = f.getFavorite(String.class);
Integer test2 = f.getFavorite(Integer.class);
Class<?> test3 = f.getFavorite(Class.class);
System.out.println(String.format("%s, %d, %s", test1, test2, test3.getName()));
}

서로 다른 클래스 객체를 저장하고 꺼내볼 수 있습니다.















Comments