स्ट्रिंग एक 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());
}
मुझे एहसास है कि संख्याओं जैसे अन्य वर्ग भी हैं जो अंतिम रूप से मुहरबंद हैं। हम पहले स्ट्रिंग का विश्लेषण करके शुरू कर सकते हैं लेकिन आपकी टिप्पणियों को स्ट्रिंग तक सीमित नहीं होना चाहिए। –
+1 ... मैं अपने जीवन में एक बार स्ट्रिंग क्लास का विस्तार करने के लिए भी चाहता था, हालांकि मुझे याद नहीं है कि क्यों –
जैसा आपने जावा (टैग) का उल्लेख किया है, यह पहले पूछा गया है: http://stackoverflow.com/questions/2068804/क्यों-है-स्ट्रिंग-फाइनल-इन-जावा –