2009-07-15 11 views
24

मुझे जावा में जेनेरिक-फीचर पसंद है और इसे अक्सर इस्तेमाल करते हैं। लेकिन मुझे एक समस्या है, अगर मैं उन पुस्तकालयों का उपयोग करता हूं जो अभी तक जेनेरिकों के बारे में नहीं जानते हैं। एक उदाहरण servlets हैं। यदि आप ServletRequest.getParameterMap() का उपयोग करते हैं तो परिणाम कच्चा नक्शा होगा, लेकिन इसमें केवल String कुंजी और String[] मान के रूप में शामिल हैं। तो मैं इसे Map<String, String[]> पर असाइन करना चाहता हूं। लेकिन इस असाइनमेंट के लिए मुझे एक चेतावनी मिलती है। @SuppressWarnings एनोटेशन के साथ चेतावनी को दबाने से नहीं, मैं भाषा के साथ इस चेतावनी से कैसे बच सकता हूं।यदि आप विरासत पुस्तकालयों का उपयोग करते हैं, तो जावा में अनचेक-रूपांतरण-चेतावनी से कैसे बचें?

उत्तर

36

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

आईआईआरसी चेतावनी उत्पन्न करने का एक प्रस्ताव है जहां कॉल के बजाय कच्चे प्रकार लौटाए जा रहे हैं।

इस बीच, मुझे लगता है कि सबसे अच्छा तरीका तो यह है कि चेतावनी के एक ही स्थान है, जहां यह उन्हें अनदेखा करने के लिए सुरक्षित है के लिए सीमित हैं एक आवरण विधि का उपयोग करने के लिए है:

class NoWarn { 
    public static Map<String, String[]> getParameterMap(ServletRequest r) 
    { 
    @SuppressWarnings("unchecked") 
    Map<String, String[]> result = r.getParameterMap(); 
    return result; 
    } 
} 

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

+0

मुझे उम्मीद है कि आपके द्वारा उल्लिखित प्रस्ताव तेजी से लागू किया जाएगा (जावा 7?), क्योंकि इससे मेरी समस्या स्पष्ट रूप से हल हो जाएगी। – Mnementh

1

मुझे नहीं लगता कि आप कर सकते हैं। चेतावनी तब तक दिखाई देगी जब तक आप इसे दबाएंगे, या इसे अपने आईडीई की चेतावनियों सूची से फ़िल्टर न करें।

2

मैं भाषा के साथ यह चेतावनी कैसे बच सकते हैं, बस दबा SuppressWarnings-टिप्पणी के साथ चेतावनी से नहीं।

एनोटेशन तरह से भाषा के साथ चेतावनी से बचना है। और कोई रास्ता नहीं है।

8

सबसे स्वच्छ चीज जो आप कर सकते हैं वह है विरासत से जेनेरिक कोड में रूपांतरण को समाहित करना और केवल चेतावनी को दबा देना।

उदा। आप अपनी विरासत पुस्तकालय पर एक सामान्य मुखौटा डाल सकते हैं, हालांकि यह हमेशा सार्थक नहीं हो सकता है।

+1

+1 विरासत एपीआई के चारों ओर एक बॉयलरप्लेट जेनरेटेड रैपर लिखें और उस पर स्लैप चेतावनी दमन। – skaffman

1

मुझे एक ही समस्या थी, मैंने बस सभी सामान्य चेतावनियों को बंद कर दिया और मुझे खुश कर दिया :) आप serialVersionUID चेतावनी भी बंद कर सकते हैं क्योंकि कई लोग serialVersionUID का उपयोग नहीं करते हैं।

ग्रहण में - विंडो/संदर्भ/जावा/कंपाइलर/त्रुटियां/चेतावनी और सभी जेनेरिक प्रकार बंद करें।

पीएस कई बुरी चेतावनियां आपको सभी चेतावनियों को अनदेखा करती हैं और कुछ उपयोगी हो सकती हैं।

+1

मैं सुधार के लिए चेतावनी का उपयोग करता हूं। मुझे कई चेतावनियां नहीं मिलती हैं, क्योंकि मैं उन्हें सभी तरह से ठीक करता हूं। आम तौर पर अनचेक-रूपांतरण-चेतावनियां कोड-पार्ट्स को ढूंढने में बहुत उपयोगी होती हैं जिन्हें बेहतर किया जा सकता है। लेकिन इस मामले में मुझे इस चेतावनी को दबाए बिना एक रास्ता नहीं दिख रहा है। – Mnementh

+1

आप भाग्यशाली हैं, अब मेरे पास परियोजना में 61 चेतावनियां हैं, यहां तक ​​कि अप्रयुक्त आयात चेतावनी भी है। मैं इसे ठीक नहीं करूँगा क्योंकि वे मेरे कोड में नहीं हैं, इसलिए मैंने समस्या टैब को बंद कर दिया है और बस मेरे स्रोत कोड में पीले टैग की तलाश की है। – IAdapter

+0

मैं एक ही परियोजना में दूसरों के कोड में भी चेतावनियों को ठीक करता हूं। यदि समस्याएं होती हैं तो हम चेकर्स के नियमों पर चर्चा करते हैं। – Mnementh

0

जैसा कि अन्य ने कहा, इस चेतावनी से छुटकारा पाने का एकमात्र तरीका इसे दबाना है।

सर्वोत्तम अभ्यास विधियों और वर्गों का उपयोग करके चेतावनी को समाहित करना है।

लेकिन अन्य चेतावनियों के साथ, हमेशा उन समस्याओं को हल करने का प्रयास करें जो उन्हें बना रहे हैं, जैसे अप्रयुक्त आयात और आदि को हटाएं ... यह आपके एप्लिकेशन को दुबला और बेहतर बनाता है।

खुश कोडिंग

0

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

Map<?, ?> map = servletRequest.getParameterMap(); 
    String[] values = (String[]) map.get("key"); 

हम मूल रूप से वाइल्डकार्ड '?' का उपयोग कर रहे हैं यह इंगित करने के लिए कि मानचित्र में किसी भी प्रकार की कुंजी और मूल्य हो सकता है।

संभावित डाउनसाइड मैं यहां देखता हूं कि हम मान लाने के दौरान एक स्पष्ट कलाकार कर रहे हैं, जो मुझे लगता है कि रनटाइम के दौरान थोड़ा सा प्रदर्शन ओवरहेड होगा।

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

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