2010-08-02 13 views
7

संभव डुप्लिकेट:
Why is String final in Java?स्ट्रिंग क्लास फ़ाइनल क्यों है?

मेरी प्रोग्रामिंग जीवन में विभिन्न क्षणों है कि मैं कामना कर रहे हैं स्ट्रिंग वर्ग अंतिम/सील/NotInheritable नहीं किया गया था।

भाषा आर्किटेक्ट्स मुझे ऐसा करने से रोकने के लिए क्या कर रहे हैं जो काम में बंदर रिंच फेंक देगा।

इसके बजाय, बंदर क्या हैं जो आर्किटेक्ट्स मुझे स्ट्रिंग क्लास को विस्तारित करने से प्रतिबंधित करके कामों में फेंकने से रोकना चाहते हैं?

क्या आप विस्तारणीय स्ट्रिंग क्लास के पेशेवरों की सूची सूचीबद्ध कर सकते हैं?

+0

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

+0

+1 ... मैं अपने जीवन में एक बार स्ट्रिंग क्लास का विस्तार करने के लिए भी चाहता था, हालांकि मुझे याद नहीं है कि क्यों –

+0

जैसा आपने जावा (टैग) का उल्लेख किया है, यह पहले पूछा गया है: http://stackoverflow.com/questions/2068804/क्यों-है-स्ट्रिंग-फाइनल-इन-जावा –

उत्तर

5

स्ट्रिंग एक immutable class है जिसका अर्थ है कि यदि आप इसे बनाने के बाद अपने राज्य को संशोधित नहीं कर सकते हैं। यदि आप किसी अन्य लाइब्रेरी में प्रवेश करने के बाद स्ट्रिंग को संशोधित कर सकते हैं, या उदाहरण के लिए मानचित्र परिणाम परिणाम अप्रत्याशित होगा।

जावा एपीआई की एक गलती यह है कि BigInteger और BigDecimal अंतिम नहीं हैं जिसका मतलब है कि आपको इन ऑब्जेक्ट्स की रक्षात्मक प्रतिलिपि गैर विश्वसनीय कोड से प्राप्त करने की आवश्यकता है। इसके विपरीत, आप हमेशा भरोसा कर सकते हैं कि String सुसंगत रहेगा।

कुटिल BigInteger:

public class DestructiveBigInteger extends BigInteger { 

    public DestructiveBigInteger(String value) { 
     super(value); 
    } 

    public BigInteger add(BigInteger val) { 
     return BigInteger.ONE; // add() method does not behave correctly 
    } 

    public BigInteger subtract(BigInteger val) { 
     throw new UnsupportedOperationException("subtract is broken"); 
    } 
} 

एक ही बात String साथ संभव नहीं है। के रूप में Effective Java में कहा गया है, आप वस्तुओं के इन प्रकार के बचाव की मुद्रा में प्रतियां बनाने की जरूरत:

public void setValue(BigInteger value) { 
    this.value = new BigInteger(value.toByteArray()); 
} 
+0

विस्तृत, कृपया। –

+1

सुनिश्चित करें कि आप * अंतिम * कीवर्ड और * मुहरबंद * कीवर्ड के बीच का अंतर जानते हैं। * अंतिम * चिह्नित वर्ग * प्रभावी रूप से सील किए गए * हैं, लेकिन यह * अंतिम * कीवर्ड का वास्तविक बिंदु नहीं है। ए * अंतिम * कक्षा ** अपरिवर्तनीय ** है, जिसका अर्थ है कि इसे बनाए जाने के बाद संशोधित नहीं किया जा सकता है। अपरिवर्तनीय कक्षाओं को भी सील किया जाना चाहिए, अन्यथा कोई गैर-अपरिवर्तनीय व्यवहार में उत्तराधिकारी, ओवरराइड और जोड़ सकता है। स्ट्रिंग जावा में अपरिवर्तनीय हैं क्योंकि उत्परिवर्तनीय तार ** खतरनाक ** हैं, और, स्पष्ट रूप से, उनके लायक होने की तुलना में अधिक परेशानी है। अधिकांश आधुनिक भाषाओं (पायथन, जावास्क्रिप्ट, सी #, जावा), अपरिवर्तनीय तारों का उपयोग करें। – Ender

4

स्ट्रिंग अंतिम है, क्योंकि यह एक अपरिवर्तनीय डेटा प्रकार का प्रतिनिधित्व करता है। कई गुना स्ट्रिंग को व्यापक रूप से विस्तारित करने के परिणामस्वरूप बहुत सारे पुस्तकालय हैं जो स्ट्रिंग ऑब्जेक्ट्स की अपरिवर्तनीयता पर निर्भर करते हैं।

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

+0

यदि मैं मानचित्र के कुंजी के लिए स्ट्रिंग का उपयोग करना चाहता था तो मैं स्ट्रिंग का उपयोग करूंगा। यदि मैं नक्शा की कुंजी के रूप में एक विस्तारित स्ट्रिंग का उपयोग करना चाहता था, तो यह वही है जो मैं करना चाहता हूं - इसे बेस स्ट्रिंग ऑब्जेक्ट्स के साथ एक्सेस करने से रोकने के लिए। अपरिवर्तनीय तर्क मेरे लिए पानी नहीं लग रहा है। –

+0

लेकिन एक विस्तारित स्ट्रिंग * एक स्ट्रिंग होगी *। तो आप इसे स्ट्रिंग से मानचित्र की कुंजी के रूप में उपयोग कर सकते हैं। प्राप्त करने में सक्षम नहीं होने से आपको कक्षा को लिखने से नहीं रोकता है जो स्ट्रिंग की क्षमताओं (रचना का उपयोग करके) को बढ़ाता है। यह आपको स्ट्रिंग्स में उस वर्ग के उदाहरण बनाने से रोकता है। – jwg

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