2011-01-20 17 views
14

मेरे पास एक सवाल है क्योंकि मुझे थोड़ा भ्रमित हो रहा है (या शायद मैं कुछ स्पष्ट नहीं देख रहा हूं)।@SuppressWarnings ("धारावाहिक")

public final class ConverterTYPE { 
    private final static HashMap<String, Byte> STRING_MAP = new HashMap<String, Byte>() { 
     { 
      put("A", new Byte((byte)12)); 
      put("B", new Byte((byte)13)); 
     } 
    }; 

} 

हम सभी जानते हैं, स्थिर क्षेत्रों धारावाहिक जा करने के लिए नहीं जा रहे हैं: मान लें कि मैं कुछ स्रोत कोड है कि वर्ग है जो इस तरह परिभाषित स्थिर क्षेत्रों की एक बड़ी संख्या में शामिल की एक बहुत कुछ शामिल है करते हैं।

हालांकि, जावा (और ग्रहण) शिकायत करता है कि "धारावाहिक वर्ग एक स्थिर अंतिम धारावाहिक VersionUID फ़ील्ड प्रकार की लंबी घोषणा नहीं करता है"। वे क्यों नहीं देख सकते कि स्थिर को क्रमबद्ध नहीं किया जा रहा है?

और अगला प्रश्न: क्या इस तरह की सभी चेतावनियों से छुटकारा पाने के लिए @SuppressWarnings("serial") का उपयोग करने के लिए यह समस्या का सही समाधान होगा?

संपादित करें:

मेरी कक्षाओं में से कोई भी Serializable इंटरफ़ेस (या उनके सुपर-क्लास में से कोई भी) लागू करता है। और ग्रहण HashMap<String, Byte> पर इसकी चेतावनियों के साथ इंगित कर रहा है। यह क्यों नहीं पता कि यह स्थिर क्षेत्र है?

+2

बस इतना ही आपको पता है - हैश मैप सीरियलज़ेबल इंटरफ़ेस लागू करता है। चूंकि आप एक अज्ञात वर्ग में हैश मैप को विस्तारित कर रहे हैं, इसलिए आपका अज्ञात वर्ग भी Serializable लागू करता है। – Numeron

+1

ऑफ-विषय: https: //blog.jooq।संगठन/2014/12/08/डॉन-क्लीवर-द-डबल-कर्ली-ब्रेसेस-एंटी-पैटर्न/ –

उत्तर

20

सिर्फ इसलिए कि उस क्षेत्र को क्रमबद्ध नहीं किया जा सकता है इसका मतलब यह नहीं है कि यह संदर्भ कभी भी धारावाहिक नहीं होगा! किसी और चीज को उस मानचित्र का संदर्भ मिल सकता है और इसे सीधे क्रमबद्ध करने का प्रयास किया जा सकता है, या इसे एक धारावाहिक वर्ग आदि में एक इंस्टेंस सदस्य का उपयोग कर सकता है। मुझे लगता है कि यह निजी है, लेकिन यह सुनिश्चित करना कि इसे वर्तमान के बाहर कभी भी एक्सेस नहीं किया जाएगा वर्ग या एक उदाहरण के सदस्य के लिए सेट संकलक के दायरे से बाहर (और प्रतिबिंब के साथ असंभव वैसे भी चारों ओर।) है

एक संभव समाधान बस सब एक साथ अनाम उपवर्ग डब्ल्यू/प्रारंभकर्ता शैली से बचने और यह करने के लिए है:

private final static HashMap<String, Byte> STRING_MAP = new HashMap<String, Byte>(); 

static { 
    STRING_MAP.put("A", new Byte((byte)12)); 
    STRING_MAP.put("B", new Byte((byte)13)); 
} 

परिणाम ज्यादातर मामलों में समान है और आपका कोड अज्ञात वर्गों के साथ peppered नहीं है।

+1

मैं दस में से नौ बार जोड़ता हूं, इस तरह के सांख्यिकीय रूप से प्रारंभिक संग्रह अपरिवर्तनीय होने का इरादा रखते हैं। उस स्थिति में, Google संग्रह लाइब्रेरी में एक अच्छा इम्यूटेबल मैप क्लास है जिसका आप उपयोग कर सकते हैं: 'ImmutableMap.of ("ए", (बाइट) 12, "बी", (बाइट) 13); '। एक 'अपरिवर्तनीय मैप भी है। बिल्डर() ', 5 तत्वों के लिए आवश्यक है। – yjo

16

हालांकि, जावा (और ग्रहण) शिकायत करता है कि "धारावाहिक वर्ग एक स्थिर अंतिम धारावाहिक VersionUID फ़ील्ड प्रकार का लंबा घोषित नहीं करता है"। वे क्यों नहीं देख सकते कि स्थिर को क्रमबद्ध नहीं किया जा रहा है?

त्रुटि संदेश और तथ्य यह है कि आपके पास अपनी कक्षा में अंतिम स्थिर सदस्य चर है (कम से कम, मैं आपके विवरण की व्याख्या कैसे करता हूं) के पास एक दूसरे के साथ कुछ भी नहीं है।

आपकी कक्षा इंटरफ़ेस Serializable लागू करती है, या आपकी कक्षा के सुपरक्लास में से एक ऐसा करता है। तो संकलक नोटिस करता है कि आपकी कक्षा धारावाहिक है। Serializable कक्षाओं में एक स्थिर अंतिम क्षेत्र होना चाहिए जिसे serialVersionUID कहा जाता है जिसका उपयोग संस्करण के लिए किया जाता है जब आप अपनी कक्षा के उदाहरणों को क्रमबद्ध करते हैं।

एनोटेशन @SuppressWarnings("serial") का उपयोग संकलक एक लापता serialVersionUID के बारे में चुप रहो बनाता है। तो हाँ, आप चेतावनी संदेश से छुटकारा पाने के लिए इसका उपयोग कर सकते हैं, लेकिन बेहतर समाधान यह है कि आपकी कक्षा को Serializable (प्रत्यक्ष या अप्रत्यक्ष रूप से) लागू नहीं किया जाए, यदि इसका क्रमबद्ध नहीं होना चाहिए।

+0

मेरी कोई भी कक्षा Serializable इंटरफ़ेस (या उनके सुपरक्लास में से कोई भी) लागू नहीं करती है। – Lukasz

+1

@ लुकास क्या आप निश्चित हैं? आपकी कक्षा पदानुक्रम कैसा दिखता है? – Jesper

+0

ग्रहण इस पर इशारा कर रहा है: हैश मैप <स्ट्रिंग, बाइट> – Lukasz

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