मुख्य रूप से सुरक्षा मुझे लगता है। इसी कारण से स्ट्रिंग अंतिम है, कोई भी सुरक्षा-संबंधित कोड अपरिवर्तनीय के रूप में व्यवहार करना चाहता है, वह अंतिम होना चाहिए।
मान लीजिए आप एक वर्ग, अपरिवर्तनीय होने के लिए यह MyUrlClass फोन परिभाषित किया गया है, लेकिन आप इसे अंतिम निशान नहीं है।
अब, किसी को इस तरह से सुरक्षा प्रबंधक कोड लिखने के लिए परीक्षा हो सकती है;
securitymanager.checkUrl(urltoconnect);
Socket sckt = opensocket(urltoconnect);
sendrequest(sckt);
getresponse(sckt);
लेकिन वे ऐसा नहीं कर सकते, क्योंकि आप MyUrlClass अंतिम नहीं था:
void checkUrl(MyUrlClass testurl) throws SecurityException {
if (illegalDomains.contains(testurl.getDomain())) throw new SecurityException();
}
और यहाँ क्या वे अपने DoRequest (MyUrlClass यूआरएल) में डाल दिया था विधि है। कारण यह नहीं है कि वे ऐसा नहीं कर सकते हैं कि अगर उन्होंने किया, तो कोड getDomain() को पहली बार "www.google.com" वापस करने के लिए ओवरराइड करके सुरक्षा प्रबंधक प्रतिबंधों से बच सकता है, और "www.evilhackers.org" दूसरा, और DoRequest() में अपनी कक्षा का एक ऑब्जेक्ट पास कर रहा है।
मैं, वैसे, अगर यह भी मौजूद है evilhackers.org के खिलाफ कुछ भी नहीं है ...
सुरक्षा चिंताओं के अभाव में यह सब के बारे में प्रोग्रामिंग त्रुटियों से परहेज है, और यह आप कैसे आप पर निर्भर निश्चित रूप से है वो करें। उप-वर्गों को अपने माता-पिता के अनुबंध को रखना होता है, और अपरिवर्तनीयता केवल अनुबंध का हिस्सा है। लेकिन यदि किसी वर्ग के उदाहरण अपरिवर्तनीय होने के लिए माना जाता है, तो इसे अंतिम रूप देने के लिए यह सुनिश्चित करने का एक अच्छा तरीका है कि वे वास्तव में सभी अपरिवर्तनीय हैं (यानी कि आसपास के लात मारने वाले उप-वर्गों के उत्परिवर्तनीय उदाहरण नहीं हैं, जिनका उपयोग माता-पिता के कहीं भी किया जा सकता है वर्ग के लिए बुलाया जाता है)।
मुझे नहीं लगता कि लेख आपको संदर्भित खासकर यदि आप एक सकारात्मक कारण विरासत के लिए अपने अपरिवर्तनीय वर्ग डिजाइन करने के लिए है एक निर्देश के रूप में लिया जाना चाहिए कि "सभी अपरिवर्तनीय कक्षाएं अंतिम होना चाहिए"। यह कह रहा था कि अपरिवर्तनीयता की रक्षा करना अंतिम के लिए एक वैध कारण है, जहां काल्पनिक प्रदर्शन चिंताओं (जो वास्तव में उस बिंदु पर बात कर रहा है) वैध नहीं हैं। ध्यान दें कि उसने "एक जटिल वर्ग को विरासत के लिए डिज़ाइन नहीं किया" जैसा कि समान रूप से वैध कारण है। यह तर्क दिया जा सकता है कि आपके जटिल वर्गों में विरासत के लिए खाते में विफल होने से बचने के लिए कुछ ऐसा है, जैसे आपकी अपरिवर्तनीय कक्षाओं में विरासत के लिए खाते में विफल होना। लेकिन यदि आप इसके लिए खाता नहीं ले सकते हैं, तो आप इसे कम करके कम से कम इस तथ्य को संकेत दे सकते हैं।
लेकिन आप अतिरिक्त अपरिवर्तनीय गुण जोड़ने के लिए एक अपरिवर्तनीय कक्षा का विस्तार करना चाह सकते हैं। –
"क्योंकि यदि कक्षा अंतिम है तो आप इसे विस्तारित नहीं कर सकते हैं और इसे व्यवहार्य बना सकते हैं" लेकिन आप एक गैर-अंतिम अपरिवर्तनीय वर्ग का विस्तार नहीं कर सकते हैं और इसे व्यवहार्य बना सकते हैं, आप केवल उपclass mutable –
कॉलर के रूप में कर सकते हैं, आप नहीं जानते कि आप अपरिवर्तनीय वर्ग या इसके उत्परिवर्तनीय उप-वर्ग का उपयोग कर रहे हैं - जब तक कि आप सीधे निर्माता को कॉल न करें। वह बहुरूपता है। – slim