2011-12-01 2 views
1

키 문자열의 주석을 사용하여 해당 키의 속성에 대한 초기 값을 구성하고 싶습니다. 예를 들어,Java annotation 매개 변수에서 여러 유형을 허용하는 방법은 무엇입니까?

@NodeProperty(initialValue = "bar") static final String "FOO"; 

다른 코드는 나중에 키 "FOO"이미 존재하지 않는 경우, 특정 키 - 값 저장소에 값 "바"와 키 "FOO"을 추가, 주석을 처리합니다. 나는 시간의 initialValue 앞서의 유형을 모르는,

@Retention(RetentionPolicy.RUNTIME) 
@interface NodeProperty { 
    long initialValue(); // I want to accept Strings, ints, byte[], etc. here. 
} 

그러나 :

내 주석 선언이다. 나는 모든 프리미티브, 문자열 및 이들의 배열을 허용하고 싶습니다.

이 작업을 수행하는 방법에 대한 아이디어가 있으십니까? 편집

:

불행하게도, 그것은 주석 매개 변수를 오버로드 같은 소리는하실 수 없습니다. 아래 답변은 다양한 해결 방법을 포함합니다.

+1

'객체'를 허용 하시겠습니까? – talnicolas

+0

주석 매개 변수 유형은 원시, Class, String, Enum 또는 이들의 배열이어야하므로 컴파일러에서 허용하지 않습니다. 프리미티브의 객체 버전조차도 허용되지 않습니다. –

+0

그것은 형식 문제가 아니지만 "컴파일시의 상수"문제입니다. –

답변

2

하나의 유형 (가능하면 String)을 수락하고 유형 변환을 사용하여 무엇을 얻었는지에서 무엇인가를 얻습니다. Commons BeanUtils 또는 XWork와 유사하게 유형 변환기를 문자열 형식 값에서 임의의 Java 클래스로 가져올 수 있습니다.

+0

감사합니다. 이것은 최선의 해결 방법이라고 생각합니다. 주석 (유형과 문자열 표현)에 두 개의 매개 변수를 지정해야합니다 --- 실제 값보다 훨씬 성가 시지만 --- 작동합니다! –

+0

@ DavidB. 필드의 유형을 가지고 있으면 안됩니다. –

+0

@Dave. 현재 작성된 바와 같이, 부동산에 대한 필드가 없으므로 귀하의 제안은 불가능합니다. 유일한 필드는 키 문자열입니다. 값의 유형은 초기 값에서 추론됩니다 (또는 이상적으로). 속성은 세 번째 파트 객체에 저장되므로 각 필드는 없습니다. 또한이 클래스 외부에서 액세스하지 않으므로 대신 주석을 배치 할 수있는 getter 또는 setter를 사용할 수 없거나 바람직하지 않습니다. –

1

다른 유형에 대해 다른 속성을 가질 수 있으며 코드에서 어떤 값이 있는지 확인하십시오. 따라서 initialValue 대신 initialInt, initialString, initial (...)을 사용할 수 있습니다. 번거롭지만, 내가 생각할 수있는 유일한 다른 방법은 항상 String 값을 사용하고 특정 유형을 파싱하는 것입니다.

다른 옵션은 선언을 취소하는 것일 수 있습니다. 주석에 키가 있고 변수에 주석을 달았습니까?

+0

선언을 뒤집는 것은 영리한 생각입니다. 불행히도 정적 최종 필드로 액세스 할 수있는 키가 필요하지만 그렇지 않으면 작동 할 것입니다. –

+1

또 다른 생각은 비록 그것이 훌륭한 (또는 심지어 좋은) 아이디어라고 말하는 것은 아니지만, 속성 값을 디폴트 값을 포함하고있는 리플렉션을 통해 액세스하는 클래스의 다른 필드의 이름으로 삼는 것이라고 생각합니다. –

+0

이것은 주석 처리 코드를 확실히 깨끗하게 만들 것이며, 추가 정적 필드를 희생합니다.정적 필드로 접근 할 수 있도록 디폴트 값을 요구하는 것은 실제로는 나쁘지는 않을 것이다. 이것들은 Java의 주석 유형 시스템의 한계를 둘러싼 모든 해킹입니다. 그러나 적어도이 것은 부정적인 것뿐만 아니라 측정 가능한 긍정적 인 부작용을 가지고 있습니다. –

관련 문제