2012-09-27 26 views
9

मैं जावा कोड लिख रहा हूं जो JSON क्रमबद्धता के लिए Jackson का उपयोग करता है। एक टिप्पणी है कि मैं एक से पहले अपने वर्गों का उपयोग करना चाहिए आदेश में इस वर्ग की एक वस्तु क्रमांकन के लिए अद्वितीय पहचानकर्ता देने के लिए @JsonTypeName(/*Insert string here*/) है। मेरे वर्तमान कोड में, हम किसी अन्य वर्ग से वैश्विक स्थिरता का उपयोग कर स्ट्रिंग तर्क सेट करते हैं। उदाहरण:जावा एनोट को एनोटेशन के लिए स्ट्रिंग तर्क के रूप में उपयोग करने में असमर्थता (उदा: जैक्सन)

public class AnnotationValues { 
    private static final String id1 = "1"; 
    private static final String id2 = "2"; 
    private static final String id3 = "3"; 
    // And so on... 
} 

इस वर्ग का उपयोग करना, हमारे एनोटेशन @JsonTypeName(AnnotationValues.id1) कैसा दिखेगा। मैं व्यक्तिगत रूप से नहीं सोचता कि यह वैश्विक स्ट्रिंग स्थिरांक की एक कक्षा का उपयोग करने के लिए एक बहुत ही मजबूत कोडिंग शैली है। एक बार मेरे आवेदन को जेएसओएन संदेशों की एक बड़ी मात्रा को संभालने की आवश्यकता होने के बाद यह परेशान हो जाएगा और इस प्रकार कई अलग-अलग पहचानकर्ताओं की आवश्यकता होती है। मैं स्वाभाविक रूप से enum का उपयोग कर, इस समस्या को हल कर दूंगा। मैं के साथ वर्ग की जगह लेंगे:

public enum AnnotationValues { 
    ID1("1"), 
    STATS_RESPONSE("2"), 
    SESSION_RESPONSE("3"), 
    /* Add more... */; 
    public final String value; 
    private AnnotationValues(String value) { 
     this.value = value; 
    } 
} 

इस enum का उपयोग करना, मैं @JsonTypeName(AnnotationsValues.ID1.value) मेरी टिप्पणी के रूप में लिखना चाहते हैं। लेकिन यह काम नहीं करता है। मैं इस त्रुटि संदेश मिलता है: "एनोटेशन विशेषता JsonTypeName.value के लिए मूल्य एक निरंतर अभिव्यक्ति होना चाहिए"। एक साधारण Google/SOF खोज मुझे this SOF post पर ले जाती है मुझे बता रही है कि यह एक त्रुटि क्यों थी; एक एनोटेशन पैरामीटर के लिए एक स्ट्रिंग मान स्थिर होना चाहिए। बहुत परेशान है कि मैं enum का उपयोग नहीं कर सकता।

क्या कोई और इस समस्या में भाग लेता है? इस प्रकार की समस्या के लिए स्वीकार्य समाधान क्या है? क्या मुझे वास्तव में मेरी टिप्पणियों के लिए स्ट्रिंग स्थिरांक की एक लंबी सूची का उपयोग करना चाहिए? क्या मैं अपने एनम का उपयोग करके बचा सकता हूं? और कुछ?

+0

क्षमा करें, लेकिन यह कैसे उस पोस्ट आप उद्धरण का डुप्लिकेट _not_ है? http://stackoverflow.com/questions/3271659/use-enum-type-as-value-parameter-for-rolesallowed-annotation – Gray

उत्तर

6

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

-1

जैसा कि अन्य उत्तर द्वारा सुझाया गया है, नहीं, जावा एनोटेशन के साथ यह संभव नहीं है।

लेकिन मैं यह पूछना चाहता था: आपको लगता है कि Enum का उपयोग स्ट्रिंग स्थिरांक का उपयोग करने से बेहतर होगा? मेरे लिए दृष्टिकोण समान दिखते हैं, और सरल सादगी के लिए, एनम रैपर जोड़ने का क्या मतलब होगा? संदर्भ दोनों ही मामलों में समान है, और वास्तविक स्थिरांक एक केंद्रीकृत जगह जो, अपने फायदे हैं ताकि आप एक ही तार साझा कर सकते हैं में संग्रहीत हैं।

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

+0

जब आप कहते हैं कि कुछ विशिष्ट एनम होना चाहिए, तो आप किसी दिए गए विधि के लिए संभावित इनपुट प्रतिबंधित करते हैं या इस मामले में एनोटेशन। आप, स्ट्रिंग स्थिरांक उपयोग करने के लिए तार की तुलना में कहीं भी और कोड पूरा होने से आ सकता है आप Enum से स्पष्ट विकल्प यह होगा यदि आप दृढ़ता से एक Enum प्रकार में टाइप कर सकते हैं के रूप में नहीं देंगे है। – Novaterata

+0

@ नोवाटेराटा कॉन्स्टेंट सभी विशिष्ट कंटेनर कक्षा के भीतर होंगे, इसलिए स्वत: पूर्णता ठीक काम करेगी। और जब सच है कि आईडीई (या संकलक) कहीं और से मनमाने ढंग से तार गुजर रहा से रोक नहीं कर सकता है, यह वास्तव में एक समस्या यह है कि वास्तव में मौजूद नहीं है को हल करने की कोशिश की तरह लगता है। – StaxMan