JAVA/Effective Java

Enum - 규칙 35 작명 패턴 대신 어노테이션을 사용하라.

반응형

만약 특정 작업을 수행할 메서드를 구별하는데 메서드 이름을 사용한다고 가정해보자.

만약 testRoute라는 메서드를 tsetRoute라고 잘못 기입했다면? 이는 실행되지 않을 것이다. 
이렇게 이름을 통해서 특정 기능을 실행하게 한다면, 오타와 같이 특수상황에서 실행이 되지 않았다는 것을 알기 어려울 뿐만아니라, 사용하기에도 네이밍 규칙을 지켜야하기 때문에 좋은 방법이 아니다.

이를 해결하기 위해서 사용하는 방법이 자바 1.5버전에 나온 어노테이션이다.

어노테이션을 이용하게 되면 실행될 메소드 지정하기 수월할 뿐 아니라 해당 메서드 안에서 예외가 발생하면 메서드가 실패한 것으로 지정하기도 편하다.

어노테이션 만들기

어노테이션 선언부 위에 존재하는 Retention, Target이라는 어노테이션들은 메타-어노테이션(Mete-annotation)이라고 부른다.

@Retention(RetensionPolicy.RUNTIME)은 Test가 실행시간에도 유지되어야 한다는 뜻.
@Target(ElementType.METHOD)는 Test가 메서드 선언부에만 적용할 수 있다는 뜻.

자세한 추가 어노테이션 생성 방법은 다음 사이트 참조.
http://i5on9i.blogspot.kr/2014/06/annotation.html 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package effective35;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
/**
 * Wedul라는 어노테이션 선언
 * 
 * @author wedul
 *
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Wedul {
    String value() default "hypocrisy";
}
cs




선언된 어노테이션을 사용



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package effective35;
 
/**
 * Anotation 사용
 * 
 * @author wedul
 *
 */
public class AnotationClass {
    @Wedul
    public static void m1() {
        System.out.println("m1 run.");
    }
    
    @Wedul(value = "cjung")
    public static void m3() {
        System.out.println("m3 run.");
        throw new RuntimeException("Boom");
    }
    
    @Wedul
    public void m5() {
        System.out.println("m5 run");
    }
}
cs




어노테이션을 사용한 메서드 조작

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package effective35;
 
import java.lang.reflect.*;
 
public class WedulRun {
    public static void main(String[] args) throws Exception {
        for (Method m : AnotationClass.class.getDeclaredMethods()) {
            if (m.isAnnotationPresent(Wedul.class)) {
                try {
                    m.invoke(nullnull);
                } catch (Exception ex) {
                    System.out.println(m + " method is failed " + ex.getCause());
                }
            }
        }
    }
}
cs



다음과 같이 클래스를 로드한 후, 리플렉션기능을 이용하여 어노테이션이 붙은 메서드만을 호출할 수 있다.

출력결과
m3 run. 
public static void effective35.AnotationClass.m3() method is failed java.lang.RuntimeException: Boom 
m1 run. 
public void effective35.AnotationClass.m5() method is failed null 


결론
작명패턴을 이용하여 특정패턴의 이름을 가진 메소드를 실행하거나 하는 프로그램을 만들지 말고, 어노테이션을 사용하여 개발을 하면 위와 같이 정보의 품질을 향상시킬 수 있다.

하지만 어노테이션을 한번 잘못 정의하여 수정하게 되는경우 해당 어노테이션을 사용하는 부분에 다 수정을 해주어야 하기 때문에 신중하게 설계하여 만들어야 한다.

출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙35 인용.

반응형