2009-06-24 6 views
15

फिलहाल मैं जावा स्विंग के लिए एक एनोटेशन-आधारित बाइंडिंग-फ्रेमवर्क विकसित कर रहा हूं जो हुड के नीचे JGoodies Binding का उपयोग करता है। दुर्भाग्यवश मैं जेआरडीओ बटन-बाइंडिंग के लिए एनोटेशन के साथ फंस गया हूं। मैं जो करना चाहता हूं वह एक मॉडल का एक संपत्ति-नाम निर्दिष्ट करता है जिसमें एक विशेष मूल्य (enum) होता है। यदि इस संपत्ति का एक विशिष्ट मूल्य है तो रेडियो-बटन का चयन किया जाएगा। अब मैं इस तरह एनोटेशन में मूल्य निर्दिष्ट करना चाहते हैं:* किसी भी * enum के लिए एनोटेशन विशेषता घोषित करने का कोई तरीका है?

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

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

हालांकि, मैं कैसे टिप्पणी के ऊपर और किसी भी अन्य enum अनुमति देने के लिए भी घोषित करने के लिए पता नहीं है। मेरा पहला अनुमान यह था, लेकिन मैंने सीखा कि एनोटेशन गुण सामान्य नहीं हो सकते:

@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

यहां सूचीबद्ध रेडियोबटन बाध्यकारी एनोटेशन में दो विचार शामिल हैं: पहला यह है कि एनम क्लास और स्ट्रिंग स्थिरांक को इसका उपयोग करने के लिए निर्दिष्ट करना है। लेकिन यह पाठ्यक्रम के प्रकार नहीं है और रनटाइम अपवादों का कारण बन सकता है। दूसरा एक एनम के मूल्य को सीधे निर्दिष्ट करना है, लेकिन ऐसा लगता है कि यह काम नहीं करता है। –

+0

बीटीडब्ल्यू मैंने जेजीडीज के साथ इस तरह की कई चीजें कीं, जो जावा में मेरे पास अधिक दुखी समय था। सबसे बड़ी समस्या यह है कि उसके पास "आधार" वर्ग है जो उसके अधिकांश वर्गों का विस्तार करता है और इसलिए उनके तरीकों में विधि (आधार, आधार, आधार) जैसे हस्ताक्षर होते हैं, जहां "बेस" कक्षा उत्तीर्ण होती है, लेकिन यह एक विशिष्ट उदाहरण होना चाहिए लेकिन हस्ताक्षर आपको कोई संकेत नहीं देता है कि यह किस विशिष्ट वर्ग का उदाहरण होना चाहिए। बाइंडिंग्स हिस्सा एक अच्छा विचार था, लेकिन उस समय उन्होंने इसे अच्छी तरह से समर्थन नहीं दिया था (यह साल पहले) और यह अधूरा था और केवल जर्मन में दस्तावेज किया गया था। –

उत्तर

3

यह जिस तरह से आप चाहते हैं उस पर काम नहीं करेगा। जैसा कि आपने पाया है, आप केवल एनोटेशन में वास्तव में सादा वापसी प्रकार का उपयोग कर सकते हैं। इसके अतिरिक्त, स्ट्रिंग का दुरुपयोग जैसी चीजें करके इन प्रतिबंधों को प्राप्त करने का प्रयास करना काम नहीं करेगा क्योंकि आपको अपनी एनोटेशन के मूल्यों को शुरू करने के लिए निरंतर अभिव्यक्ति का उपयोग करने की आवश्यकता है।

मुझे लगता है कि आपको सबसे करीब मिलना है स्ट्रिंग के साथ शुरू करना और फिर एनम के नाम() के साथ तुलना करने के लिए कोड का उपयोग करना। लेकिन वहाँ से चला जाता है अपने प्रकार सुरक्षा ...

1

अपने enums सभी एक ही इंटरफ़ेस को लागू कर सकते हैं, जो आपके लिए उपयोगी हो सकता है इस सवाल "Coding tip - intersection types and java enums"

+0

दुर्भाग्य से नहीं, लेकिन फिर भी टिप के लिए धन्यवाद। –

+0

एनोटेशन विशेषता में आप उस सामान्य इंटरफ़ेस का वास्तव में उपयोग कैसे करेंगे? '<टी Enum और MyInterface> T enumValue(); 'इंटरफ़ेस के बिना किसी भी बेहतर काम नहीं करता है। – Imre

0

मैं इस में ठीक उसी समस्या को हल करने की कोशिश कर रहा था, और जहाँ तक मुझे पता है, यह नहीं किया जा सकता है। यह एक असली बमर है।

मेरे मामले में, मैं @Version एनोटेशन निर्दिष्ट करना चाहता था, जहां कोई गणना का उपयोग किया जा सकता है, और enum मानों को क्रमशः (संस्करणों के क्रम को खोजने के लिए) की तुलना की जा सकती है। ऐसा लगता है कि मुझे कुछ अन्य ढांचे (जैसे गिसिस मुझे लगता है) करने की ज़रूरत है और इसके बजाय युगल का उपयोग करें; थोड़ा बदसूरत, लेकिन> = और < = चेक के लिए ठीक काम करता है।

संबंधित मुद्दे

 संबंधित मुद्दे