Item 30 : 이왕이면 제네릭 메소드로 만들라
2021. 7. 29. 22:36
제네릭 타입과 마찬가지로 클라이언트에서 입력 매개변수와 반환값을 명시적으로 형변환해야 하는 메소드보다 제네릭 메소드가 더 안전하며 사용하기도 쉽다.
알기 쉬운 예시로는 Collections의 알고리즘 메소드는 모두 제네릭이다.
우리는 앞선 Item 26에서 로타입을 사용하면 안되는 이유를 학습했다.
public static Set union(Set s1, Set s2) {
Set result = new HashSet(s1);
result.addAll(s2);
return result;
}
위의 로 타입 메소드는 컴파일은 되지만 런타임시에 타입 에러가 발생한다.
위의 코드를 변환한 단순한 제네릭 메소드 타입을 보자
public static void main(String[] args){
Set<String> guys = Set.of("톰", "딕", "해리");
Set<String> stooges = Set.of("래리", "모에", "컬리");
Set<String> aflCio = Union(guys, sootges);
}
합집합을 만드는 제네릭 메소드인데 경고없이 컴파일 되며 타입 안전하고 쓰기도 쉽다.
제네릭 싱글톤 팩토리
때때로 불변 객체를 사용할 때 타입을 유연하게 바꿔야 하는 상황이 발생하는데
요청한 타입 매개변수에 맞게 매번 그 객체의 타입을 바꿔주는 정적 팩토리를 제네릭 싱글톤 팩토리라 한다.
private static UnaryOperator<Object> IDENTITY_FN = (t) -> t;
@SuppressWarnings("unchecked")
public static <T> UnararyOperator<T> identityFunction() {
returnb (UnaryOperator<T>) IDENTITY_FN;
}
이렇게 하면 객체를 생성할때 Object 위치에 타입이 들어올때 마다 형변환을 알아서 해주게 된다.
string 배열을 만들어 UnaryOperator<String> 으로 사용하거나
Number 배열을 만들어 UnaryOperator<Number>의 형태처럼 사용 가능하다.
'책 > 이펙티브자바' 카테고리의 다른 글
Item 32 : 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) | 2021.07.31 |
---|---|
Item 31 : 한정적 와일드카드를 사용해 API유연성을 높이라 (0) | 2021.07.31 |
Item 29 : 이왕이면 제네릭 타입으로 만들라 (0) | 2021.07.29 |
Item 28 : 배열보다는 리스트를 사용하라 (0) | 2021.07.27 |
Item 27 : 비검사 경고를 제거하라 (0) | 2021.07.26 |