(이펙티브 자바) 아이템 30. 이왕이면 제네릭 메서드로 만들라
이번 아이템은 메서드를 만들때 이왕이면 제네릭 메서드로 만들것을 권장한다.
명시적으로 형변환을 해주어야하는 메서드 보다는 제네릭 메서드로 만들면 형변환이 필요없어지며 새로운 사용자가 유입되었을때 훨씬 편리하게 코드를 작성할 수 있도록 도와준다는 점을 강점으로 들고 있다.
아래 코드는 컴파일시에 문제는 없지만 경고문구가 발생한다.
(사실 책에는 경고문구가 발생한다고 기술되어있지만 나의 인텔리제이에서는 경고 문구가 뜨질 않는다. 아마 JVM 5, 6 버전에서 발생하는 경고 문구인 것 같다.)
public static Set union(Set s1, Set s2) {
Set result = new HashSet(s1);
result.addAll(s2);
return result;
}
발생하는 이유는 Set에 무슨타입이 들어올지 모르기 때문이다.
Set<String> 일지, Set<Integer>일지..
그러기 때문에 우리는 해당 코드를 타입 세이프하게 만들어주어야한다. 그것에 대한 해답이 바로 제네릭이다.
public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
Set<E> result = new HashSet<>(s1);
result.addAll(s2);
return result;
}
(JAVA) 제네릭의 사용
제네릭을 사용하는 이유 제네릭 타입을 사용함으로써 잘못된 타입이 선언되어 런타임 시점에 발생하는 오류를 컴파일 시점에서 제거할 수 있다. 제네릭은 클래스와 인터페이스, 메소드를 정의�
jwdeveloper.tistory.com
제네릭 싱글톤 팩터리 패턴
때로는 불변 객체를 여러 타입으로 활용할 수 있게 만들어야 할 때가 있다. 제네릭은 런타임에 타입 정보가 소거되므로 하나의 객체를 어떤 타입으로든 매개변수화할 수 있다. 하지만 이렇게 하려면 요청한 타입 매개변수에 맞게 매번 그 객체의 타입을 바꿔주는 정적 팩터리를 만들어야 한다.
이를 제네릭 싱글톤 팩터리 패턴이라 한다. 다음 항등함수(identity function)에 대한 코드를 보자.
private static UnaryOperator<Object> IDENTIFY_FN = (t) -> t;
@SuppressWarnings("unchecked")
public static<T> UnaryOperator<T> identityFunction() {
return (UnaryOperator<T>) IDENTIFY_FN;
}
항등함수객체는 무상태이니 요청마다 매번 새로 만드는 것은 낭비다. 그리고 타입별로 하나씩 만들어야 했겠지만 소거 방식을 사용한 덕에 제네릭 싱글턴 하나면 충분하다. 이 코드는 비검사 형변환 경고가 발생하지만 항등함수는 언제나 같은 값을 반환하는 특별한 함수이므로 (unaryOperator<T>)를 사용해도 타입 안전하다. 그러니 @SuppressWarnings로 경고를 숨겨도 안심할 수 있다.