2011-10-17 5 views
11

क्या उन दोनों के बीच अंतर है। उत्तरार्द्ध एक नई धारावाहिक कक्षा क्यों बनाते हैं? The serializable class does not declare a static final serialVersionUID field of type longअंतर>() {}

उत्तर

13

पहले उदाहरण में, आप एक ArrayList उदाहरण बना रहे हैं:

new ArrayList<Clazz>() 

एक नया खाली ArrayList

new ArrayList<Clazz>(){} 

ग्रहण से पता चलता पैदा करता है। उत्तरार्द्ध में आप ArrayList के अज्ञात उप-वर्ग का उदाहरण बना रहे हैं। आमतौर पर आप subclass, में एक या अधिक विधियों को ओवरराइड करेंगे अन्यथा ऐसा बनाने में बहुत अधिक बिंदु नहीं है। जॉन स्कीट बताते हैं, एक सामान्य प्रकार के अज्ञात सबक्लास बनाने के लिए एक हैकी कारण है, his answer देखें।

The Eclipse कि चेतावनी देते हैं, आदेश Serializable विनिर्देशों (ArrayListSerializable है, इसलिए अपने सभी उपवर्गों भी कर रहे हैं), तो आप एक अद्वितीय serialVersionUID उपवर्ग में जहाँ से deserialization प्रक्रिया सुनिश्चित कर सकते हैं परिभाषित करना चाहिए का पालन करने में उस वर्ग परिभाषा धारावाहिक होने के बाद से महत्वपूर्ण रूप से नहीं बदला है (महत्वपूर्ण == आपने स्वयं निर्णय लिया है कि नई परिभाषा पुराने के साथ असंगत है, इसलिए आप serialVersionUID को बदलकर इस तथ्य को व्यक्त कर सकते हैं)। यदि आप सूची को क्रमबद्ध करने के लिए कभी नहीं जा रहे हैं, तो चेतावनी कोई फर्क नहीं पड़ता।

+2

बेनामी उपवर्ग हो जाता है। मैं इतना अंधा क्यों था .. –

7

Joonas कहते हैं, दूसरे उदाहरण में आप एक गुमनाम आंतरिक वर्ग बना रहे हैं। हालांकि, ऐसा करने का एक कारण है जब भी आप किसी भी तरीके से ओवरराइड नहीं कर रहे हैं आदि: यह आपको निष्पादन समय पर ArrayList के तत्व प्रकार को निर्धारित करने की अनुमति देता है - क्योंकि अनाम आंतरिक कक्षा का सुपरक्लास केवल ArrayList<Clazz> है ArrayList

यह कैसे प्रकार शाब्दिक Guice में काम करते हैं। यह एक बदसूरत हैक का एक सा है, लेकिन यह काम किया ...

+0

यह उसे रनटाइम पर तत्व प्रकार निर्धारित करने की अनुमति कैसे देता है? –

+1

@LouisRhys: यदि आप उदाहरण पर 'getClass()' कहते हैं, तो यह अनाम वर्ग देगा। यदि आप 'getGenericSuperclass()' को कॉल करते हैं तो 'टाइप' में उपयुक्त जानकारी होगी। –