kkkkkkkkkkkk
kkkkk
kkkkkkkkkkkk
전체 방문자
오늘
어제
  • 분류 전체보기
    • CS & OS
    • Algorithms
    • Laguage
    • Book
      • 객체지향의 사실과 오해
      • Effective Java
      • Spring boot 와 AWS로 혼자 구현하는 ..
      • 도메인 주도 계발 시작하기
    • DB
    • Spring
    • Spring Boot
    • JPA
    • Git
    • Clean Code
    • HTTP

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 설계 원칙
  • 객체지향 프로그래밍
  • 결합도
  • 역할
  • 응집도
  • 책임

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
kkkkkkkkkkkk

kkkkk

Book/Effective Java

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

2022. 9. 2. 01:32

class 리터럴의 타입은 Class가 아닌 Class<T> 다.

  • String.class 는 Class<String>
  • Integer.class 는 Class<Integer>

 

컴파일타임 타입 정보와 런타임 타입 정보를 알아내기 위해 메서드들이 주고 받는 class 리터럴을 타입 토큰(type token) 이라 한다.

 

 

 

타입 안전 이종 컨테이너 패턴(type safe heterogeneous container pattern)

  • 컨테이너 대신 키를 매개변수화한 다음, 컨테이너에 값을 넣거나 뺄 때 매개변수화한 키를 함계 제공 하는 패턴

 

 

이종 컨테이너 패턴 예제 코드

 

public class Favorites {
    public <T> void putFavorites(Class<T> type, T instance);
    public <T> T getFavorites(Class<T> type);
}

 

키가 매개변수화되었다는 점만 빼면 일반 맵 처럼 보인다. 클라이언트는 즐겨찾기를 저장하거나 얻어올 때 Class 객체만 알려주면 된다.

 

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

    favorites.putFavorites(String.class, "java");
    favorites.putFavorites(Integer.class, 100);
    favorites.putFavorites(Class.class, Favorites.class);

    String string = favorites.getFavorites(String.class);
    Integer integer = favorites.getFavorites(Integer.class);
    Favorites favorites1 = favorites.getFavorites(Favorites.class);
}

 

이종 컨테이너 패턴을 적용한 Favorites 인스턴스는 타입 안전하다.

 

 

이종 컨테이너 패턴 예제 코드 구현

 

public class Favorites {

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

    public <T> void putFavorites(Class<T> type, T instance) {
        favorites.put(Objects.requireNonNull(type), type.cast(instance));
    }

    public <T> T getFavorites(Class<T> type) {
        return type.cast(favorites.get(type));
    }
}

 

메서드들이 허용하는 타입을 제한하고 싶을 때 한정적 타입 토큰을 활용하자.

'Book > Effective Java' 카테고리의 다른 글

[Item 34] int 상수 대신 열거 타입을 사용하라  (0) 2022.09.02
[Item 32] 제네릭과 가변인수를 함께 쓸 때는 신중하라  (0) 2022.08.31
[Item 31] 한정적 와일드카드를 사용해 API 유연성을 높이라  (0) 2022.08.31
[Item 30] 이왕이면 제네릭 메서드로 만들라  (0) 2022.08.30
[Item 29] 이왕이면 제네릭 타입으로 만들라  (0) 2022.08.18
[Item 28] 배열보다는 리스트를 사용하라  (0) 2022.08.18
[Item 27] 비검사 경고를 제거하라  (0) 2022.08.06
[Item 26] 로 타입(Raw Type)은 사용하지 말라  (0) 2022.08.05
    'Book/Effective Java' 카테고리의 다른 글
    • [Item 34] int 상수 대신 열거 타입을 사용하라
    • [Item 32] 제네릭과 가변인수를 함께 쓸 때는 신중하라
    • [Item 31] 한정적 와일드카드를 사용해 API 유연성을 높이라
    • [Item 30] 이왕이면 제네릭 메서드로 만들라
    kkkkkkkkkkkk
    kkkkkkkkkkkk

    티스토리툴바