ElementVisitor — 프로그램 요소 방문자 인터페이스
ElementVisitor — 프로그램 요소 방문자 인터페이스
ElementVisitor<R, P>는 방문자 디자인 패턴 스타일로 프로그램 요소를 방문하는 인터페이스예요. 이 인터페이스를 구현하는 클래스는 요소의 종류를 컴파일 시점에 알 수 없을 때 그 요소를 조작하는 데 쓰여요. 방문자가 요소의 accept 메서드에 전달되면 그 요소에 가장 적합한 visitXyz 메서드가 호출돼요.
R은 방문자 메서드의 반환 타입(결과가 필요 없으면 Void), P는 방문자 메서드에 추가로 넘기는 매개변수의 타입(추가 매개변수가 필요 없으면 Void)이에요. 구현 클래스에 따라 추가 매개변수 p가 null일 때 NullPointerException을 던질 수도 있고 던지지 않을 수도 있어요.
본문
구현 클래스로는 AbstractElementVisitor146, ElementKindVisitor146, ElementScanner146, SimpleElementVisitor146 등이 있어요. 선언은 다음과 같아요.
public interface ElementVisitor<R,P>
API 노트: 이 인터페이스에 미래 자바 언어 구조를 수용하기 위해 메서드가 추가될 수 있어요. 직접 구현한 방문자 클래스는 미래 플랫폼 버전과 소스 호환이 깨질 수 있으므로, 적절한 추상 방문자 클래스를 확장하는 게 좋아요. 다만 API는 매개변수·반환 타입으로 이 방문자 인터페이스를 쓰는 걸 권장해요. 새 언어 구조를 위한 메서드는 visitModule, visitRecordComponent처럼 default 메서드로 추가되어 소스 호환을 강하게 보장해요.
주요 메서드는 다음과 같아요.
default R visit(Element e) // visit(e, null)과 동일
R visit(Element e, P p)
R visitExecutable(ExecutableElement e, P p) // 메서드·생성자·초기화자
default R visitModule(ModuleElement e, P p) // 모듈
R visitPackage(PackageElement e, P p) // 패키지
default R visitRecordComponent(RecordComponentElement e, P p)
R visitType(TypeElement e, P p) // 클래스·인터페이스
R visitTypeParameter(TypeParameterElement e, P p)
R visitUnknown(Element e, P p) // 알 수 없는 종류
R visitVariable(VariableElement e, P p) // 변수
util 패키지에는 FooVisitorN처럼 N이 소스 버전을 나타내는 방문자 계열이 있어요. FooVisitorN은 소스 버전 N의 모든 언어 구조를 다루도록 설계되며, 버전 N+1에 새 구조가 없으면 후속 버전도 처리할 수 있어요.