5장. 제네릭

Red Culture·2021년 5월 24일
0
  • 아이템 31: 한정적 와일드 카드를 사용해 API 유연성을 높여라
    -유연성을 극대화하려면 원소의 생산자나 소비자용 입력 매개변수에 와일드카드 타입을 사용하라.
    -반환 타입에는 한정적 와일드카드 타입을 사용하면 안된다. 유연성을 높여주기는 커녕 클라이언트 코드에서도 화일드카드 타입을 써야하기 때문.
    -메서드 선언에 타입 매개변수가 한 번만 나오면 와일드 카드로 대체하라.

  • 아이템 32: 제네릭과 가변인수를 함께 쓸 때는 신중하라
    -제네릭 varargs(가변인자) 배열 매개변수에 값을 저장하는 것은 안전하지 않음
    -@SafeVarargs 애너테이션은 메서드 작성자가 그 메서드가 타입 안전함을 보장하는 장치
    → 타입 안전한지는 어떻게 확신할 수 있을까?
    → 가변 인수 메서드를 호출할 때 varargs 매개변수를 담는 제네릭 배열이 만들어지는데 메서드가 이 배열에 아무것도 저장하지 않고(매개변수들을 덮어쓰지 않고) 배열의 참조가 밖으로 노출되지 않으면 타입 안전함
    → varargs 매개변수 배열이 호출자로부터 그 메서드로 순수하게 인수들을 전달하는 일만 한다면 그 메서드는 안전함(varargs 매개변수 배열에 아무것도 저장하지 않고도 타입 안전성을 깰 수도 있으니 주의해야함)
    -제네릭 varargs 매개변수 배열에 다른 메서드가 접근하도록 허용하면 안전하지 않음
    → 예외 케이스
    1) @SafeVarargs로 제대로 애노테이트된 또 다른 varargs 메서드에 넘기는 것은 안전함
    2) 배열 내용의 일부 함수를 호출만 하는 (varargs를 받지 않는) 일반 메서드에 넘기는 것도 안전함

    -제네릭이나 매개변수화 타입의 varargs 매개변수를 받는 모든 메서드에 @SafeVarargs 를 달라.
    → 재정의 할 수 없는 메서드에 달아야함
    → 자바8에서 오직 정적 메서드와 final 인스턴스 메서드에 붙일 수 있고, 자바9부터는 private 인스턴스 메서드에도 허용됨

  • 아이템 33: 타입 안전 이종 컨테이너를 고려하라
    -동적 형변환으로 런타임 타입 안전성을 확보하자

profile
자기 개발, 학습 정리를 위한 블로그

0개의 댓글

관련 채용 정보