[이펙티브 자바] 아이템 44. 표준 함수형 인터페이스를 사용하라

June·2022년 3월 13일
0

[이펙티브자바]

목록 보기
39/72

람다가 지원되면서 상위 클래스의 기본 메서드를 재정의해 원하는 동작을 구현하는 템플릿 메서드 패턴의 매력이 줄었다. 현대적인 방법은 같은 효과의 함수 객체를 받는 정적 팩터리나 생성자를 제공하는 것이다. 즉 함수 객체를 매개변수로 받는 것이다.

java.util.function 패키지를 보면 다양한 용도의 표준 함수형 인터페이스가 담겨 있다. 필요한 용도에 맞는게 있다면, 직접 구현하지 말고 표준 함수형 인터페이스를 활용하라.

  • Operator: 인수가 하나인 UnaryOperator와, 2개인 BinaryOperator. 반환값과 인수의 타입이 같다.
  • Predicate: 인수를 받아 boolean 반환.
  • Function: 인수와 반환 타입이 다른 함수
  • Supplier: 인수를 받지 않고 값을 반환.
  • Consumer: 인수를 하나 받고 반환값은 없는 함수

표준 함수형 인터페이스 대부분은 기본 타입만 지원한다. 기본 함수형 인터페이스에 박싱된 기본 타입을 넣어 사용하지는 말자. 성능이 느려질 수 있다.

하지만 구조적으로 표준 함수형 인터페이스가 존재해도 직접 작성해야할 때가 있다.

Comparator<T>를 생각해보면 구조적으로 ToIntBiFunction<T, U>와 동일하다.
하지만 Comparator는

  • 이름 자체가 용도를 잘 설명한다.
  • 구현하는 쪽에서 지켜야할 규칙을 담고 있다.
  • 디폴트 메서드를 담고 있다.

이 중 하나 이상을 만족하면 전용 함수형 인터페이스 구현을 고려하자.

전용 함수형 인터페이스에는 항상 @FunctionalInterface 애너테이션을 사용하자.

  • 인터페이스가 람다용으로 설계된 것임을 알려준다.
  • 인터페이스가 추상 메서드를 하나만 갖고 있어야 컴파일 되게 해준다.
  • 누군가 실수로 메서드를 추가하지 못하게 해준다.

0개의 댓글