티스토리 뷰
728x90
반응형
이왕이면 제네릭 메서드로 만들라
- 클래스와 마찬가지로 메서드도 제네릭으로 만들 수 있습니다. 매개변수화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭입니다.
public class Collections {
private Collections() { }
// 정적 유틸리티 제네릭 메서드
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
}
💡로 타입(raw type) 메서드
- 아래 raw type의 메서드는 제네릭의 장점인 타입 안정성을 확보할 수 없습니다. 또한 addAll(s2)를 하는 순간도 런타임시 ClassCastException을 발생시킬 위험이 있습니다.
public static Set union(Set s1, Set s2) {
Set result = new HashSet(s1);
result.addAll(s2);
return result;
}
💡제네릭 타입 메서드
- <E>를 사용하여 타입 안정성이 확보된 상태에서 사용할 수 있습니다.
public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
Set<E> result = new HashSet(s1);
result.addAll(s2);
return result;
}
💡추가적인 리펙토링
- union 제네릭 메서드는 반환 타입 1개와 매개변수로 받는 타입 2개로 총 3개의 타입이 일치해야하는데 이를 와일드카드 타입으로 더 유연하게 리펙토링할 수 있습니다.
public static <E> Set<E> union(Set<? extends E> s1, Set<? extends E> s2) {
Set<E> result = new HashSet(s1);
result.addAll(s2);
return result;
}
💡제네릭 싱글톤 팩토리
- 불변 객체를 여러 타입으로 활용할 수 있게 만들어야 하는 경우가 있는데, 제네릭은 런타임에 타입 정보가 소거되므로 하나의 객체를 어떤 타입으로든 매개변수화할 수 있습니다. 하지만 그렇게 만들기 위해서는 요청한 타입 매개변수에 맞게 객체의 타입을 바꿔주는 정적 팩토리를 만들어야 합니다.
- 이러한 패턴을 제네릭 싱글톤 팩토리라하며 Collections.reverseOrder같은 함수 객체나 Collections.emptySet같은 컬렉션용으로 사용합니다.
💡제네릭 싱글톤 팩토리 패턴으로 구현한 항등함수
- 항등함수란 입력 값을 수정없이 그대로 반환하는 특별한 함수이므로, T가 어떤 타입이든 UnaryOperator<T>를 사용해도 타입 안전합니다.
private static final UnaryOperator<Object> IDENTITY_FN = t -> t;
//입력 값을 그대로 반환하는 항등함수이기에 안전하다.
@SuppressWarnings("unchecked")
public static <T> UnaryOperator<T> identityFunction(){
return (UnaryOperator<T>) IDENTITY_FN;
}
💡재귀적 타입 한정 (recursive type bound)
- 자기 자신이 들어간 표현식을 사용해 타입 매개변수의 허용 범위를 한정하는 개념으로 Comparable 인터페이스와 함께 사용되는데, 이 인터페이스는 제네릭 타입 인터페이스고 보통 자기자신과 비교하기 위해 사용합니다.
- 비교 대상이 되는 매개변수 T 타입도 대부분 자신과 같은 타입의 원소와만 비교할 수 있습니다.
public interface Comparable<T> {
int compareTo(T o);
}
public final class String implements Comparable<String> {
... 생략
}
728x90
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바 - Item32. 제네릭과 가변인수를 함께 쓸 때는 신중하라. (0) | 2022.07.23 |
---|---|
이펙티브 자바 - Item31. 한정적 와일드카드를 사용해 API 유연성을 높이라. (0) | 2022.07.22 |
이펙티브 자바 - Item29. 이왕이면 제네릭 타입으로 만들라. (0) | 2022.07.20 |
이펙티브 자바 - Item28. 배열보다는 리스트를 사용하라. (0) | 2022.07.18 |
이펙티브 자바 - Item27. 비검사 경고를 제거하라. (0) | 2022.07.18 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- spring boot poi excel download
- redis sorted set으로 대기열 구현
- 람다 표현식
- spring boot excel download oom
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- spring boot 엑셀 다운로드
- JDK Dynamic Proxy와 CGLIB의 차이
- spring boot excel download paging
- microkernel architecture
- 트랜잭셔널 아웃박스 패턴 스프링부트
- redis sorted set
- polling publisher spring boot
- @ControllerAdvice
- spring boot redisson 분산락 구현
- java userThread와 DaemonThread
- 공간 기반 아키텍처
- service based architecture
- pipe and filter architecture
- pipeline architecture
- spring boot redisson sorted set
- java ThreadLocal
- redis 대기열 구현
- space based architecture
- 서비스 기반 아키텍처
- spring boot redis 대기열 구현
- 자바 백엔드 개발자 추천 도서
- spring boot redisson destributed lock
- transactional outbox pattern spring boot
- transactional outbox pattern
- 레이어드 아키텍처란
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함