AnnotationValueVisitor — 어노테이션 값 방문자 인터페이스
AnnotationValueVisitor — 어노테이션 값 방문자 인터페이스
AnnotationValueVisitor<R, P>는 방문자 디자인 패턴의 변형을 사용해 어노테이션 인터페이스 요소의 값을 방문하는 인터페이스예요. 표준 방문자가 타입 계층의 멤버 구체 타입에 따라 디스패치하는 것과 달리, 이 방문자는 저장된 데이터의 타입에 따라 디스패치해요. 예를 들어 boolean 값과 int 값을 저장하는 별개의 서브클래스는 없어요.
이 인터페이스를 구현하는 클래스는 값의 타입을 컴파일 시점에 알 수 없을 때 그 값을 조작하는 데 쓰여요. 방문자가 값의 accept 메서드에 전달되면 그 값에 해당하는 visitXyz 메서드가 호출돼요. R은 방문자 메서드의 반환 타입, P는 추가 매개변수의 타입이에요.
본문
구현 클래스로는 AbstractAnnotationValueVisitor146, SimpleAnnotationValueVisitor146 등이 있어요. 선언은 다음과 같아요.
public interface AnnotationValueVisitor<R,P>
API 노트: 이 인터페이스에 미래 자바 언어 구조를 수용하기 위해 메서드가 추가될 수 있어요. 이 인터페이스를 직접 구현한 방문자 클래스는 미래 플랫폼 버전과 소스 호환이 깨질 수 있으므로, 직접 구현 대신 적절한 추상 방문자 클래스를 확장하는 것을 권장해요. 단, API는 매개변수·반환 타입으로 이 방문자 인터페이스를 쓰는 게 좋아요.
주요 메서드는 다음과 같아요.
default R visit(AnnotationValue av) // visit(av, null)과 동일
R visit(AnnotationValue av, P p)
R visitAnnotation(AnnotationMirror a, P p)
R visitArray(List<? extends AnnotationValue> vals, P p)
R visitBoolean(boolean b, P p)
R visitByte(byte b, P p)
R visitChar(char c, P p)
R visitDouble(double d, P p)
R visitEnumConstant(VariableElement c, P p)
R visitFloat(float f, P p)
R visitInt(int i, P p)
R visitLong(long i, P p)
R visitShort(short s, P p)
R visitString(String s, P p)
R visitType(TypeMirror t, P p)
R visitUnknown(AnnotationValue av, P p) // 알 수 없는 종류의 값
visitBoolean~visitType은 각 값 타입별 디스패치 메서드예요.visitEnumConstant는 열거 상수를,visitType은 타입 값을 방문해요.visitUnknown은 미래 언어 구조처럼 알 수 없는 값을 처리할 때 호출돼요.
이 패키지의 util 하위에는 FooVisitorN처럼 N이 소스 버전을 나타내는 여러 방문자 계열이 있어요. FooVisitorN은 소스 버전 N의 모든 언어 구조를 다루도록 설계됐어요.