जावा में StringBuilder
और StringBuffer
के बीच अंतर अच्छी तरह से प्रलेखित हैं और touched upon in StackOverflow भी हैं।क्यों स्ट्रिंगबिल्डर और स्ट्रिंगबफर एक आम इंटरफ़ेस लागू नहीं करते हैं?
असल में, StringBuilder
के बाद से यह StringBuffer
के लिए एक तेजी से ड्रॉप-में स्थानापन्न के रूप में इरादा था काफी एक ही इंटरफ़ेस के साथ StringBuffer
की एक गैर सिंक्रनाइज़ प्रति है,। उनका एपीआई व्यावहारिक रूप से समान है और वे वास्तव में वर्तमान जेडीके में पहुंच योग्य अमूर्त वर्ग के उप-वर्ग हैं।
एक बात जो मुझे आश्चर्य है, इसलिए, वे सार्वजनिक रूप से संबंधित नहीं हैं। StringBuilder
के उप-वर्ग के रूप में दोनों वर्गों को एक सामान्य इंटरफ़ेस लागू करने या StringBuffer
होने के कारण दोनों वर्गों के लिए साझा कोड के अस्तित्व की अनुमति होगी।
तो यह क्यों अलग हो गया? क्या ऐसा था कि प्रोग्रामर अनजाने में थ्रेड-असुरक्षित कोड के साथ थ्रेड-सुरक्षित मिश्रण नहीं करेंगे? या यह सिर्फ एक डिजाइन निरीक्षण था जो अब अनंत काल के अंत में विरासत में मिलेगा?
संपादित करें: मैं क्यों बातें इस तरह हैं पर अटकलें कर सकते हैं, लेकिन मैं एक वास्तविक निर्णय करने के लिए ठोस संदर्भ के लिए उम्मीद कर रहा हूँ, उदाहरण के लिए:
बातें स्पष्ट करना करने के लिए एक जेएसआर प्रक्रिया के दौरान। जो कुछ भी मेरे लिए कुछ प्रकाश डालेगा, वह ऐसी स्थिति है जो कभी-कभी कठिनाई का कारण बनती है।
संपादित करें 2:
तथ्य यह है कि दोनों वर्गों को लागू Appendable
पूरी तरह से मेरे मन फिसल गया। शायद क्योंकि यह विशेष इंटरफ़ेस अधिकांश उद्देश्यों के लिए बेकार है - यह केवल एक ही वर्ण या तैयार वस्तु को जोड़ सकता है और यही वह है। ज्यादातर मामलों में यह Object
के उप-वर्ग होने वाले दोनों वर्गों की तुलना में अधिक उपयोगी नहीं है।
संपादित करें 3:
मूल्यांकन पुस्तकालयों टीम द्वारा:
ठीक है, यहाँ a semi-official source से वास्तव में इस सवाल के लिए तर्क है
यह है डिजाइन द्वारा कि StringBuffer और StringBuilder कोई साझा सार्वजनिक सुपरटेप साझा करें। वे विकल्प होने का इरादा नहीं रखते हैं: एक गलती (स्ट्रिंगबफर) है, और दूसरा (स्ट्रिंगबिल्डर) प्रतिस्थापन है।
स्पष्ट रूप से एक सामान्य सुपरटेप की कमी, कुछ मामलों में, धीमा हो सकता है-स्ट्रिंगबफर से स्ट्रिंगबिल्डर तक माइग्रेशन के लिए। फ्लिप पक्ष यह है कि एक सामान्य सुपरटेप जोड़कर, हम की त्रुटियों को अतीत और सार्वजनिक इंटरफ़ेस में इन्हें समय के लिए हमारे साथ रहने के लिए लगाएंगे। यह केवल माइग्रेशन को धीमा नहीं करता है: यह इसे हटा देता है।
विधियां हैं उदा। संलग्न करें (लंबा) जो दोनों वर्गों में हैं लेकिन इंटरफेस में से कोई भी नहीं। –
हालांकि मुझे लगता है कि वेक्टर और ऐरेलिस्ट कैसे सार सूची का विस्तार करते हैं, स्ट्रिंगबफर और स्ट्रिंगबिल्डर एक समान सार वर्ग बढ़ा सकते हैं। मैंने नवीनतम स्रोत को नहीं देखा है, लेकिन स्ट्रिंगबिल्डर सिंक्रनाइज़ेशन से स्ट्रिंगबफर कम से कम चीर-ऑफ लग रहा था। –
@MatthewFlaschen append() परिशिष्ट से है। –