HihoBookStudy / EffectiveJava

이펙티브 자바 북스터디입니다.
1 stars 0 forks source link

[Item 39] 배열 방식과 `@Repeatable` 사용 방식의 차이 #39

Closed ForteEscape closed 1 week ago

ForteEscape commented 1 month ago

Q. 책(p. 243)에서는 다음과 같이 설명하고 있습니다.

자바 8에서는 여러 개의 값을 받는 어노테이션을 다른 방식으로도 만들 수 있다. 배열 매개변수로 받는 대신 어노테이션에 @Repeatable 메타어노테이션을 다는 방식이다.

질문은 다음과 같습니다.

  1. @Repeatable 어노테이션을 사용하여 구현한 방식이 배열을 사용한 방식보다 더 복잡하고, 유의할 점이 많아 보입니다. 이것이 책에서 배열을 사용하여 구현하는 방식에서 유의할 점을 생략해서 그런 것인지가 궁금합니다.
  2. 만약 유의할 점이 차이가 없다면, @Repeatable 메타어노테이션을 사용하여 얻을 수 있는 이득이 무었인지 궁금합니다.
zpqmdh commented 2 weeks ago

배열 방식과 @Repeatable 어노테이션을 비교하기 위해 둘의 예시를 들어보겠습니다.

1. 배열 방식

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExceptionTest {
    Class<? extends Throwable>[] value();
}
@ExceptionTest({IllegalArgumentException.class, NullPointerException.class})
public void someTest() {
    // 테스트 코드
}

[장점]

[단점]

2. @Repeatable 어노테이션

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface ExceptionTests { ExceptionTest[] value(); }

* 기본 애너테이션 정의
```java
import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Repeatable(ExceptionTests.class)
public @interface ExceptionTest {
    Class<? extends Throwable> value();
}
@ExceptionTest(IllegalArgumentException.class)
@ExceptionTest(NullPointerException.class)
public void someTest() {
    // 테스트 코드
}

[장점]

[단점]

따라서 단순한 값의 집합을 처리할 때는 배열을 사용하는 것이 더 간편하고 직관적입니다. 하지만 각각의 애너테이션 인스턴스에 대한 유연성과 가독성이 중요할 때는 @Repeatable을 사용하는 것이 더 적합합니다.