दिलचस्प पोस्ट
Xcode 4.2 डिबग स्टैक कॉल का प्रतीक नहीं है जब izip के बजाय ज़िप का उपयोग करना बेहतर है? स्ट्रिंग को "" का उपयोग करके कैसे प्रारंभ किया जा सकता है? गूगल मैप्स एपीआई v3.19 इंटरनेट एक्सप्लोरर क्वेरक्स मोड में टूटी हुई है क्यों कुछ DOCTYPE घोषणाओं का कारण 100% हेइट टेबल और divs काम करना बंद करने के लिए? सीएसवी से स्क्रीन आउटपुट तक डेटा पढ़ना क्या एक जावा वर्ग रनटाइम पर खुद को एक विधि जोड़ सकता है? सरणी में स्ट्रिंग है? एंड्रॉइड: फोन नंबर से संपर्क नाम पुनर्प्राप्त करें मैं फ़ायरफ़ॉक्स या क्रोम के साथ HTTP POST अनुरोधों को मैन्युअल रूप से कैसे फंसा सकता हूं? स्कैनफ़ हर दूसरे को छोड़ देता है जबकि सी में लूप होता है @ वेल्यू के साथ वसंत अभिव्यक्ति भाषा (एसपीईएल): डॉलर बनाम हैश ($ बनाम #) Log4j में अपना खुद का एपेन्डर कैसे बना सकता है? MySQL में चल रहे कुल की गणना करें क्या मुझे कोई भी शून्य * कास्टिंग करते समय static_cast या reinterpret_cast का उपयोग करना चाहिए

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

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

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

आपका सर्वोत्तम संदर्भ यहां यहोशू ब्लॉच की उत्कृष्ट पुस्तक "प्रभावी जावा" की मद 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 कर सकते हैं, तो आप उस तरीके को जोड़ सकते हैं जो स्ट्रिंग मान को संशोधित करने की इजाजत देता है, अब कोई कोड नहीं भरोसा कर सकता है कि स्ट्रिंग समान रहती है अगर यह केवल ऊपर की स्ट्रिंग प्रतिलिपि बनायेगी, बजाय इसे डुप्लिकेट करना चाहिए स्ट्रिंग।

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

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

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

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