2010-05-24 10 views
5

ब्लॉक उद्धरण जावा डॉक्स से कर रहे हैं -ऑब्जेक्टइनपुटस्ट्रीम फ़िल्टर इनपुटपुट का विस्तार नहीं करना चाहिए?

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

एक DataInputStream एक आवेदन एक अंतर्निहित इनपुट धारा से आदिम जावा डेटा प्रकार पढ़ा एक मशीन स्वतंत्र ढंग से कर सकते हैं।

DataInputStream इसलिए फैली FilterInputStream

एक ObjectInputStream एक ObjectOutputStream का उपयोग कर आदिम डेटा deserializes और वस्तुओं पहले से लिखा।

हालांकि, किसी कारण से ObjectInputStreamFilterInputStream विस्तार नहीं करता है, भले ही यह भी अंतर्निहित इनपुट धारा से वस्तुओं (इस बार और नहीं आदिम प्रकार) पढ़ रहा है। संबंधित वर्गों की शाखाकरण यहां दी गई है।

alt text

उसी के लिए एक डिजाइन तर्क है है?

उत्तर

1

मुझे लगता है कि ऑब्जेक्ट इनपुटपुट को फ़िल्टर इनपुट स्ट्रीम की हर विधि को ओवरराइड करना था।

जब आप ऐसा करते हैं तो वास्तव में उस संबंध को बनाए रखने का एक बिंदु नहीं है।

क्या महत्वपूर्ण है: ObjectInputStream एक InputStream (आप अभी भी अन्य पद्धतियों के अतिरिक्त यह करने के लिए आदिम डेटा लिख ​​सकते हैं) है और वह कोई संबंध है।

+0

फ़िल्टरइनपुटस्ट्रीम इनपुटस्ट्रीम के अलावा कोई अतिरिक्त विधि नहीं जोड़ता है; यह इनपुटस्ट्रीम –

+0

@ वैभव बाजपेई में प्रदान की गई सभी विधियों को लागू करता है: यदि आप सूर्य के कार्यान्वयन को देखते हैं, तो आप देखेंगे कि यह इनपुटस्ट्रीम को पार नहीं करता है, लेकिन ब्लॉकडाटाइनपुटस्ट्रीम नामक एक निजी आंतरिक वर्ग है। एक बार जब आपके पास FilterInputStream.in मेमवर के लिए कोई उपयोग नहीं है, तो आपको वास्तव में इसकी आवश्यकता नहीं है। –

+0

@ वैभव बाजपाई: मैंने पाया कि कुछ मामलों में जब मुझे एक प्रतिनिधि इनपुट/आउटपुट स्ट्रीम लागू करना पड़ा, तो मैं फ़िल्टरइनपुटस्ट्रीम को छोड़कर और विशेष रूप से यह बुराई चचेरे भाई फ़िल्टरऑटपुटस्ट्रीम को छोड़कर हमेशा बेहतर था। फ़िल्टरऑटपुटस्ट्रीम के मामले में यह लूप के संदर्भ में 'लिखना (बाइट [])' विधि लागू करता है जो बफर के आकार को 'लिखने (int)' कहते हैं। मैंने अपने संस्करण के साथ नियमित स्ट्रीम स्विच करने के बाद क्यों बिल्ली का प्रदर्शन इतना बुरा था, यह जानने का प्रयास करने में एक सुंदर 2 दिन बिताए हैं। जब आप बेस क्लास के कार्यान्वयन को जानना चाहते हैं तो यह सबसे खराब मामलों में से एक है। –

2

के बीच भेद नहीं है:

  • तार्किक विरासत (शेयर इंटरफेस)
  • 'कोड' विरासत जब आप

वर्गों के बीच कोड का हिस्सा तार्किक रूप से LinkedList नहीं AbstractList के रूप में यह नहीं है सार। हालांकि कोड बिंदु के दृष्टिकोण से List विधियों के कुछ कार्यान्वयन को साझा करना फायदेमंद है क्योंकि वे दूसरों के संदर्भ में लागू हो सकते हैं, आमतौर पर एक ही दक्षता के साथ (उदाहरण के लिए isEmpty को size() == 0 के रूप में कार्यान्वित किया जा सकता है)।

कुछ प्लेटफॉर्म, जैसे कि गोब्जेक्ट (या कुछ विस्तारित हास्केल - हालांकि यह ओओ भाषा नहीं है और कई चीजें पूरी तरह अलग हैं) इंटरफेस में विधियों के डिफ़ॉल्ट कार्यान्वयन को कम करती है जो इसे परिभाषित कर रही है।

हालांकि यह जावा के मामले में नहीं है जो कोड का पुन: उपयोग करने के लिए Abstract* कक्षाओं का उपयोग करता है। Filter*Stream इतना परिभाषित नहीं है कि आउटपुट कहीं भेजा जाता है (क्योंकि जावा I/O का पूरा बिंदु यह है कि निर्माता/रिसीवर परवाह नहीं है) लेकिन इसका उपयोग सामान्य कोड का पुन: उपयोग करने के लिए किया जाता है।

3

संवेदनशील प्रश्न। इसके बारे में सोचते हुए, मेरा मानना ​​है कि Object*Stream को Filter*Stream (यह आउटपुट या इनपुट पर लागू होता है) को बढ़ाने के लिए डिज़ाइन किया गया था। ऐसा क्यों नहीं किया गया था? शायद क्योंकि:

  1. यह कोई वास्तविक लाभ नहीं देता है। जैसा कि मासीज द्वारा समझाया गया है, Filter*Stream के बिंदु, कुछ महत्वहीन संगठन वर्गों के अलावा, कुछ सामान्य डिफ़ॉल्ट (और बल्कि तुच्छ) उन वर्गों के कार्यान्वयन को कार्यान्वित करना है (कुछ अंतर्निहित धारा से पढ़ें/लिखें, आखिरकार धारा को बदलना), अन्य वर्गों (जावा एपीआई या उपयोगकर्ता से) द्वारा विस्तारित किया जाना चाहिए। लेकिन Filter*Streamइंटरफेस नहीं है: उदाहरण के लिए, Filter*Stream को तर्क के रूप में आपको कुछ विधि कभी नहीं मिलेंगी या लागू नहीं करेंगी। इसलिए, कक्षा बनाने का निर्णय *Stream या Filter*Stream का विकल्प होता है, जब विकल्प होता है, तो ज्यादातर एक कार्यान्वयन निर्णय होता है; कक्षा के उपयोगकर्ता मूल रूप से परवाह नहीं करेंगे।

  2. ObjectOutputStream की डिजाइनर, पूरी तरह से इसके reimplementing, उन वर्ग का विस्तार करने के लिए तैयार करने के लिए अतिरिक्त लचीलापन देने का फैसला किया (कोई अंतर्निहित OuputStream के साथ) एक अतिरिक्त empty constructor देकर। यह सुविधा (बल्कि दुर्लभ, मुझे लगता है) कक्षा को (अवधारणात्मक रूप से और कार्यान्वयन के अनुसार) Filter*Stream कक्षा से दूर एक लिट रखती है। फिर, यह निर्णायक प्रतीत नहीं होता है।

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