효과적인 자바! 표준 기능 인터페이스 사용을 선호합니다.

람다를 Java 언어의 일부로 사용하면 더 많은 구현이 가능해졌습니다. 하위 클래스가 상위 클래스의 동작을 특수화하기 위해 메서드를 재정의하는 템플릿 메서드 패턴과 같은 대체 패턴을 사용하기 전에는 이제 특수화 기능으로 사용되는 람다를 사용하는 팩토리 메서드를 사용할 수 있습니다.

다른 예인 LinkedHashMap을 살펴보겠습니다. 이것은 가장 오래된 항목으로 각 removeEldestEntry 작업에서 호출되고 반환될 때 put 가장 오래된 항목을 제거하는 true를 재정의하여 캐시 역할을 할 수 있습니다. 예를 들어 맵을 100개 항목으로 제한하려면 다음과 같이 작성할 수 있습니다.

protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
  return size() > 100;
}

이 방법은 잘 작동하지만 오늘 빌드된 경우 이 목적을 달성하기 위해 람다를 전달하는 것이 더 깨끗할 수 있습니다. 그래서 이 지도가 무엇을 취해야 하는지 생각해 봅시다. 물론 Map.Entry<K,V> 메서드와 마찬가지로 removeEldestEntry가 필요합니다. 또한 size 메서드를 호출하기 때문에 지도 자체에 대한 참조가 필요합니다. 마지막으로 이 경우 boolean 가 되는 반환 유형을 고려해야 합니다. 따라서 이것을 모두 합치면 다음을 얻을 수 있습니다.

@FunctionalInterface
interface EldestEntryRemovalFunction<K,V> {
  boolean remove(Map<K,V> map, Map.Entry<K,V> eldest);
}

이 인터페이스는 훌륭하게 작동합니다. 바로 우리가 필요로 하는 것입니다. 질문은 이것이 필요합니까? Java는 많은 사용 사례를 다루는 java.util.function 패키지에서 43개의 기능 인터페이스를 제공합니다. 나는 아무도 당신이 모든 인터페이스를 외울 것이라고 기대하지 않는다고 생각하지만 우리가 이해한다면 우리가 사용할 수 있는 인터페이스를 도출할 수 있는 특정 빌딩 블록이 있습니다.

이러한 빌딩 블록에 대해 알아보겠습니다. 기능적 인터페이스에는 다섯 가지 주요 클래스가 있습니다. 동일한 인수 유형을 취하고 반환하는 연산자 인터페이스(각각 하나와 두 개의 인수를 취하는 단항 및 이진 버전이 있음). 인수를 취하고 부울을 반환하는 술어입니다. 인수와 반환 유형이 다른 함수입니다. 인수를 사용하지 않고 값을 반환하는 공급업체입니다. 인수를 취하고 아무 것도 반환하지 않는 소비자입니다.
int , longdouble 에서 작동하는 각각의 세 가지 변형이 있습니다. IntPredicate int 와 같은 패턴에서 하나의 기본 유형에서 다른 기본 유형으로 변환하는 함수 인터페이스도 있습니다. 소스가 프리미티브이고 결과가 객체인 경우 boolean 패턴을 따릅니다(예: SrcToResult ).

이것은 인터페이스를 사용하려고 할 때 가능성에 대한 감각을 제공해야 합니다. 이 장의 핵심은 자신만의 인터페이스를 만드는 대신 이러한 표준 인터페이스를 사용하도록 권장하는 것입니다. 이러한 표준 인터페이스를 사용하면 사람들에게 더 친숙한 것을 사용하고, 관리할 코드가 줄어들고, 기본 제공 유형에는 술어를 함께 결합하는 것과 같이 사용할 수 있는 유용한 방법이 있습니다.

지적해야 할 또 다른 사항은 우리를 위해 생성된 이러한 모든 인터페이스 중 대부분은 boxing 및 unboxing 없이 기본 요소를 사용할 수 있다는 것입니다. 이 모든 것이 제공되면 기본 형식 대신 boxed 형식을 사용할 이유가 없습니다.

그렇다면 언제 우리 고유의 기능적 인터페이스를 만들어야 할까요? 고유한 인터페이스를 만들고 싶은 경우가 몇 가지 있습니다. 첫 번째 경우가 가장 분명합니다. 인터페이스 중 어느 것도 요구 사항을 충족하지 않는 경우 고유한 인터페이스를 만드십시오. 다른 경우는 특정 사물을 나타내기 위해 여러 곳에서 사용될 뿐만 아니라 더 설명적인 이름을 만드는 것이 훨씬 더 합리적일 때입니다.

요약하면, 람다를 사용할 때 먼저 자체 인터페이스를 구축하는 것보다 내장된 기능 인터페이스 중 하나를 사용하는 것을 고려하십시오.

좋은 웹페이지 즐겨찾기