दिलचस्प पोस्ट
एक JTable सेल क्लिक-सक्षम में एक JButton कैसे बनाने के लिए? कोणीय 2 http नहीं मिल रहा है कैच ब्लॉक में फेंक दिया अपवाद – फिर से पकड़ा जाएगा? Jquery में ऊपर / नीचे स्क्रॉल के बीच अंतर करते हैं? एक्सैमर 2.0 बनाम एपसेलेरेटर टाइटेनियम बनाम फोनगैप एकाधिक सीएसवी फ़ाइलों को अलग-अलग डेटा फ़्रेमों में पढ़ें MySQL – तालिकाओं के बीच 2 अलग-अलग डेटाबेस में शामिल हो? WCF सेवा बनाने के लिए WSDL फ़ाइल का उपयोग कैसे करें (कॉल नहीं करें) नोडजेएस को एक वैश्विक मॉड्यूल / पैकेज की आवश्यकता है कैसे एक <svg> तत्व को विस्तारित करने के लिए या इसके मूल कंटेनर को अनुबंधित करना है? पटरियों 3 की जाँच करें कि क्या विशेषता बदल गई है अभिलेखागार के भीतर यादृच्छिक अभिगम के लिए अच्छा समर्थन के साथ संपीड़न प्रारूप? mongodb: डालें अगर मौजूद नहीं है मैं स्ट्रिंग को इंट में कैसे बदल सकता हूँ? Node.js 7.5 पर 'अनपेक्षित पहचानकर्ता का इंतजार करें'

जावा में विरासत को निषेध करने के लिए अच्छे कारण हैं?

जावा में विरासत को निषेध करने के लिए अच्छे कारण क्या हैं, उदाहरण के लिए, एक एकल, निजी पैरामीटर वाले निर्माता का उपयोग करके अंतिम कक्षाओं या कक्षाओं का उपयोग करके? विधि को अंतिम बनाने के अच्छे कारण क्या हैं?

वेब के समाधान से एकत्रित समाधान "जावा में विरासत को निषेध करने के लिए अच्छे कारण हैं?"

आपका सर्वोत्तम संदर्भ यहां यहोशू ब्लॉच की उत्कृष्ट पुस्तक "प्रभावी जावा" की मद 17 (15) है, जिसे "डिज़ाइन और विरासत के लिए दस्तावेज या अन्य इसे निषिद्ध करता है" कहा जाता है। आपको वाकई इसे पढ़ना चाहिए, लेकिन मैं संक्षेप में बताऊंगा।

अपने माता-पिता के साथ विरासत में मिली कक्षाओं की बातचीत आश्चर्यजनक और अयोग्य हो सकती है अगर पूर्वज को विरासत में नहीं लिया गया है।

क्लास इसलिए दो प्रकार के होते हैं:

  1. विस्तार करने के लिए डिज़ाइन किए गए वर्ग, और यह वर्णन करने के लिए पर्याप्त दस्तावेज के साथ कि यह कैसे किया जाना चाहिए

  2. अंतिम नामांकित कक्षाएं

यदि आप विशुद्ध रूप से आंतरिक कोड लिख रहे हैं तो यह थोड़ी अधिक ओवरकिल हो सकता है। हालांकि क्लास फ़ाइल में पांच अक्षर जोड़ने में अतिरिक्त प्रयास बहुत छोटा है। यदि आप केवल आंतरिक comsumption के लिए लिख रहे हैं तो भविष्य में एक भविष्य वाला कोडर हमेशा 'अंतिम' को हटा सकता है – आप इसे एक चेतावनी के रूप में सोच सकते हैं "यह वर्ग मन में विरासत के साथ तैयार नहीं किया गया था"।

हो सकता है कि आप एक विधि को अंतिम रूप देना चाहें ताकि ओवरराइडिंग क्लास उन व्यवहार को बदल सकें, जो कि अन्य तरीकों में गिना जाता है। कन्स्ट्रक्टरों में बुलाए जाने वाले तरीके अक्सर अंतिम घोषित किए जाते हैं ताकि ऑब्जेक्ट्स बनाने के दौरान आपको कोई अप्रिय आश्चर्य न मिले।

एक वर्ग अंतिम बनाने का एक कारण होगा यदि आप विरासत को लेकर मजबूर होना चाहते हैं। कक्षाओं के बीच तंग युग्मन से बचने में यह आम तौर पर वांछनीय है

आप अपरिवर्तनीय वस्तुओं ( http://en.wikipedia.org/wiki/Immutable_object ) बनाना चाहते हैं, तो आप एक सिंगलटन ( http://en.wikipedia.org/wiki/Singleton_pattern ) बनाना चाहते हैं, या आप चाहें तो दक्षता, सुरक्षा, या सुरक्षा के कारणों के लिए किसी विधि को ओवरराइड करने से रोकने के लिए

ऐसे तीन उपयोग के मामले हैं जहां आप अंतिम तरीकों के लिए जा सकते हैं।

  1. विशिष्ट आधार वर्ग की कार्यक्षमता को ओवरराइड करने से व्युत्पन्न वर्ग से बचने के लिए।
  2. यह सुरक्षा उद्देश्यों के लिए है, जहां आधार वर्ग उस ढांचे के कुछ महत्वपूर्ण मुख्य कार्यक्षमता दे रहा है जहां व्युत्पन्न वर्ग इसे बदलना नहीं चाहता है
  3. फाइनल पद्धतियां उदाहरण विधियों की तुलना में तेज़ होती हैं, क्योंकि अंतिम और निजी तरीकों के लिए आभासी तालिका अवधारणा का कोई उपयोग नहीं है। तो जहां कभी एक संभावना है, अंतिम तरीकों का इस्तेमाल करने की कोशिश करें।

कक्षा अंतिम बनाने का उद्देश्य:

ताकि कोई भी उन कक्षाओं को बढ़ा सके और उनके व्यवहार को बदल सके।

उदाहरण: आवरण वर्ग पूर्णांक अंतिम श्रेणी है। यदि वह वर्ग अंतिम नहीं है, तो कोई भी पूर्णांक को अपने वर्ग में बढ़ा सकता है और पूर्णांक वर्ग के मूल व्यवहार को बदल सकता है। इससे बचने के लिए, जावा ने सभी आवरण वर्गों को अंतिम कक्षा के रूप में बनाया।

विरासत एक chainsaw की तरह है – बहुत शक्तिशाली है, लेकिन गलत हाथों में भयानक। या तो आप एक वर्ग से विरासत में आने के लिए डिज़ाइन करते हैं (जो लचीलापन को सीमित कर सकते हैं और बहुत अधिक समय ले सकते हैं) या आपको इसे प्रतिबंधित करना चाहिए

प्रभावी जावा 2 संस्करण आइटम 16 और 17 देखें, या मेरे ब्लॉग पोस्ट "वंशानुक्रम कर"

हम्म् … मैं दो चीजों के बारे में सोच सकता हूं:

आपके पास एक ऐसा वर्ग हो सकता है जो कुछ सुरक्षा समस्याओं से निपटता है इसे उप-क्लासिंग करके और आपके सिस्टम को इसके उपवर्गाकृत संस्करण खिलाकर, एक हमलावर सुरक्षा प्रतिबंधों को खतरा बना सकता है। उदाहरण के लिए आपका आवेदन प्लगइन्स का समर्थन कर सकता है और यदि कोई प्लगइन आपकी सुरक्षा संबंधित कक्षाओं को केवल उप-वर्ग कर सकता है, तो यह किसी भी प्रकार के उपवर्ग संस्करण को स्थानांतरित करने के लिए इस चाल का उपयोग कर सकता है। हालांकि, यह ऐसा कुछ नहीं है, जिसमें सूर्य को एप्लेट और उसकी तरह से निपटना पड़ता है, हो सकता है कि ऐसा कोई यथार्थवादी मामला न हो।

एक और अधिक यथार्थवादी एक वस्तु से बचने के लिए एक अस्थिर हो जाता है। उदाहरण के बाद स्ट्रिंग्स अपरिवर्तनीय हैं, आपका कोड सुरक्षित रूप से इसका संदर्भ रख सकता है

  String blah = someOtherString; 

स्ट्रिंग को कॉपी करने के बजाय पहले। हालांकि, यदि आप स्ट्रिंग subclass कर सकते हैं, तो आप उस तरीके को जोड़ सकते हैं जो स्ट्रिंग मान को संशोधित करने की इजाजत देता है, अब कोई कोड नहीं भरोसा कर सकता है कि स्ट्रिंग समान रहती है अगर यह केवल ऊपर की स्ट्रिंग प्रतिलिपि बनायेगी, बजाय इसे डुप्लिकेट करना चाहिए स्ट्रिंग।

उन चीजों को करने से रोकने के लिए जो खुद को और दूसरों को भ्रमित कर सके एक भौतिक विज्ञान पुस्तकालय की कल्पना करें जहां आपके पास कुछ परिभाषित स्थिरांक या गणना है अंतिम कीवर्ड का उपयोग किए बिना, कोई भी बुनियादी गणना या स्थिरांक को फिर से परिभाषित कर सकता है जो कभी भी बदलना नहीं चाहिए।

इसके अलावा, अगर आप वाणिज्यिक बंद स्रोत वर्ग लिख रहे हैं, तो आप शायद यह नहीं चाहें कि लोगों को लाइन में कार्यक्षमता बदलनी पड़े, खासकर अगर इसके लिए समर्थन देने की जरूरत है और लोगों ने आपकी पद्धति को ओवरराइड कर दिया है और शिकायत कर रही है कि इसे कॉल करने से अप्रत्याशित परिणाम

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

आप एक विधि को अंतिम बनाना चाहते हैं, ताकि ओवरराइडिंग क्लास अपने व्यवहार को परिवर्तित न करें। जब आप व्यवहार को बदलने में सक्षम होना चाहते हैं तो विधि सार्वजनिक बनाएं जब आप एक सार्वजनिक विधि को ओवरराइड करते हैं तो इसे बदला जा सकता है।