2009-06-24 6 views
15

지금은 후드 아래에서 JGoodies Binding을 사용하는 Java Swing 용 어노테이션 기반 바인딩 프레임 워크를 개발 중입니다. 불행히도 JRadioButton 바인딩에 대한 주석이 붙어 있습니다. 원하는 것은 특별한 값 (enum)을 가진 모델의 프로퍼티 이름을 지정하는 것입니다. 이 속성에 특정 값이있는 경우 라디오 버튼을 선택해야합니다. 지금은이 같은 주석의 값을 지정하려면 :* any * enum에 대한 주석 특성을 선언 할 수있는 방법이 있습니까?

@RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.FIRST) 
JRadioButton firstButton 

@RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.SECOND) 
JRadioButton secondButton 

그러나, 나도 어떤 다른 열거 위 및 을 허용하는 주석을 선언하는 방법을 모르겠어요. 내 첫번째 추측이이었다, 그러나 나는 주석 속성은 일반적인 수 없다는 것을 알게 :

@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface RadioButtonBinding { 

    /** The model-property to which the selected value is bound */ 
    String property(); 

    // Idea 1: Specifying the enum class and the enum constant as String - works but is not typesafe 

    Class<? extends Enum<?>> enumClass(); 

    String enumConstantName(); 

    // Idea 2: Directly specifying the enum constant - gives a compile-time error 

    <T extends Enum<T>> T enumValue(); 

} 

모든 아이디어를 어떻게 이것을 해결하기 위해?

+0

여기에 나열된 RadioButtonBinding 주석에는 두 가지 아이디어가 포함되어 있습니다. 첫 번째 것은 Enum 클래스와 그에서 사용할 문자열 상수를 지정하는 것입니다. 하지만 이것은 타입 안전하지 않으며 RuntimeExceptions로 이어질 수 있습니다. 두 번째는 열거 형 값을 직접 지정하는 것이지만 작동하지 않는 것 같습니다. –

+0

btw 나는 JGoodies와 함께 이런 종류의 것들을 많이했는데, 나는 자바에서 더 비참한시기였다. 가장 큰 문제는 다른 클래스의 대부분이 확장하는 "기본"클래스를 가지므로 그의 메소드는 메서드 (base, base, base)와 같은 서명을 가지며 "기본"클래스가 전달 된 특정 인스턴스 여야하지만 서명은 특정 클래스에 대한 힌트를 제공하지 않습니다. 바인딩 부분은 좋은 생각 이었지만 시간 (몇 년 전)에 잘 팔리지 않았고 미완성이고 독일어로만 문서화되었습니다. –

답변

3

원하는대로 작동하지 않습니다. 알아 낸 것처럼 주석에 정말 평범한 반환 유형 만 사용할 수 있습니다. 또한 String을 악용하는 것과 같은 작업을 수행하여 이러한 제한을 피하려고하면 주석 값을 초기화하는 데 상수 식을 사용해야하므로 작업하지 않습니다.

가장 가까운 문자열은 문자열로 초기화 한 다음 코드를 사용하여 열거 형 이름()과 비교하는 것입니다. 그러나, 당신이이 질문을 유용하게 사용할 수있는 당신의 유형 안전 ...

1

이 열거 형은 모두 같은 인터페이스를 구현 할 수있는 경우가 간다 "Coding tip - intersection types and java enums"

+0

불행히도, 어쨌든 팁을 주셔서 감사합니다. –

+0

주석 속성에서 공용 인터페이스를 정확히 사용하는 방법은 무엇입니까? ' & MyInterface> T enumValue();'는 인터페이스없이보다 잘 작동하지 않습니다. – Imre

0

나는이 동일한 문제를 해결하기 위해 노력하고 멀리했다 나는 그것이 할 수 없다는 것을 안다. 정말 실망 스럽습니다.

필자의 경우 @Version 주석을 지정하고 싶었습니다. 열거 형을 사용할 수 있으며 열거 형 값은 서수로 비교할 수 있습니다 (버전 순서 지정). 내가 생각하는 Guice와 같은 다른 프레임 워크를 수행하고 대신 double을 사용해야하는 것처럼 보입니다. 조금 못생긴지만,> = 및 < = 확인을 위해 잘 작동합니다.

관련 문제