@ExtensionMethod java core class를 확장해서 써보자

(작성자: KH)

개요

Java에서 class를 확장 할 수 있는 방법은 상속이다. 하지만 다른 언어들은 Extension이라는 문법을 제공한다. Extension은 class, interface에 새로운 기능을 추가할 수 있게 해준다. 예를들어 자주 사용되는 Optional, List, String에 개발자가 원하는 기능을 추가할 수 있다는 의미다.

Java에선 Lombok을 이용해서 비슷하게 구현할 수 있고 그 기능의 이름은 @ExtensionMethod 이다.

Extension 예제

java.time.LocalDateisBetween 함수를 추가해본다.

public class DateComparators {

  // static function isBetween 함수를 추가
  public static boolean isBetween(@NonNull LocalDate date, @NonNull LocalDate startDate,
      @NonNull LocalDate endDate) {
    return (date.isEqual(startDate) || date.isAfter(startDate))
        && (date.isEqual(endDate) || date.isBefore(endDate));
  }

  public static boolean isBetween(@NonNull LocalDateTime dateTime, @NonNull LocalDate startDate,
      @NonNull LocalDate endDate) {
    val date = dateTime.toLocalDate();
    return isBetween(date, startDate, endDate);
  }
}

아래와 같이 lombok @ExtensionMehod 를 이용해 LocalDate class를 확장할 수 있다.

@ExtensionMethod(DateComparators.class)
class DateComparatorsTest {

  @Test
  void startDate_미만이면_false() {
    // given
    val START_DATE = LocalDate.of(2024, 1, 2);
    val END_DATE = LocalDate.of(2024, 1, 4);
    // when
    val result = LocalDate.of(2024, 1, 1)
		    .isBetween(START_DATE, END_DATE); // isBetween을 사용할 수 있게됨.
    // then
    assertThat(result).isFalse();
  }
}

주의점

intellij에선 자동완성 지원이 안된다.

Lombok @Extension PR

자동완성 기능추가 압박하러 가기

Untitled

참고문서

Lombok @ExtensionMethod

Kotlin Extensions