스터디/이펙티브 자바

[Effective Java] Item39. 명명 패턴보단 어노테이션

📝 작성 : 2022.06.26  ⏱ 수정 : 
728x90

명명 패턴

Junit 3까지 테스트 메서드의 이름이 test로 시작해야만 했던 것과 같이 이름을 짓는 규칙

명명 패턴의 문제

  • 오타
  • 올바른 프로그램 요소만 사용되리란 보증이 없음
  • 프로그램 요소를 매개변수로 전달할 마땅한 방법이 없음

어노테이션

jdk 5부터 추가된 기능, 추가적인 정보를 제공하는 메타 데이터

메타 데이터이기 때문에 비즈니스 로직에 직접적인 영향을 주진 않지만, 이 정보에 따라서 실행 흐름을 변경할수 있는 코딩이 가능하여 더 깔끔한 코딩이 가능해 질 수 있음

마커 어노테이션 (Marker annotation)

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test {}

메타 어노테이션: 어노테이션 선언에 다는 어노테이션
@Retention(RetentionPolicy.RUNTIME): 런타임에도 유지
@Target(ElementType.METHOD): 메서드 선언에만 사용되어야 함

매개 변수를 가진 어노테이션

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExceptionTest {
      Class<? extends Throwable> value();
}

public class Test {
      @ExceptionTest(ArithmeticException.class)
      public static void doSomething() {
        int i = 1/0;
    }
}

배열 매개변수를 받는 어노테이션

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExceptionTest {
    Class<? extends Throwable>[] value();
}

public class Test {
      @ExceptionTest({ IndexOutOfBoundsException.class, NullPointerException.class })
      public static void doSomething() {
        List<String> strings = new ArrayList<>();
        strings.addAll(3, null);
      }
}
반응형