CharSequence= इंटरफ़ेस
String= ठोस कार्यान्वयन
तुमने कहा था:
एक से दूसरे में परिवर्तित करना
से कोई रूपांतरित नहीं होता है String।
- हर
Stringवस्तु है एक CharSequence।
- हर
CharSequenceएक का उत्पादन कर सकते हैं String। पुकारते हैं CharSequence::toString। यदि CharSequenceऐसा होता है String, तो विधि अपनी वस्तु का संदर्भ देती है।
दूसरे शब्दों में, हर Stringएक है CharSequence, लेकिन हर CharSequenceएक नहीं है String।
एक अंतरफलक के लिए प्रोग्रामिंग
एंड्रॉइड में प्रोग्रामिंग करना, अधिकांश पाठ मूल्यों में चारसेंसेंस में अपेक्षित हैं।
ऐसा क्यों है? लाभ क्या है, और स्ट्रिंग पर CharSequence का उपयोग करने के मुख्य प्रभाव क्या हैं?
आमतौर पर, एक इंटरफ़ेस से प्रोग्रामिंग कंक्रीट कक्षाओं के लिए प्रोग्रामिंग से बेहतर है। यह लचीलापन देता है, इसलिए हम अन्य कोड को तोड़ने के बिना किसी विशेष इंटरफ़ेस के ठोस कार्यान्वयन के बीच स्विच कर सकते हैं।
विभिन्न प्रोग्रामर द्वारा विभिन्न परिस्थितियों में उपयोग किए जाने वाले एपीआई को विकसित करते समय, संभव सबसे सामान्य इंटरफेस देने और लेने के लिए अपना कोड लिखें। यह कॉलिंग प्रोग्रामर को उस इंटरफ़ेस के विभिन्न कार्यान्वयनों का उपयोग करने की स्वतंत्रता देता है, जो भी कार्यान्वयन उनके विशेष संदर्भ के लिए सबसे अच्छा है।
उदाहरण के लिए, जावा कलेक्शंस फ्रेमवर्क को देखें । अपने एपीआई देता है या वस्तुओं का एक आदेश दिया संग्रह लेता है, के रूप में उपयोग करते हुए अपने तरीकों की घोषणा Listकरने के बजाय ArrayList, LinkedListया किसी भी अन्य 3-पक्ष कार्यान्वयन List।
जब एक त्वरित और गंदे छोटे तरीके को केवल एक विशिष्ट स्थान पर आपके कोड द्वारा उपयोग किया जाता है, तो कई जगहों पर उपयोग किए जाने वाले एपीआई लिखने के विपरीत, आपको एक विशिष्ट कंक्रीट के बजाय अधिक सामान्य इंटरफ़ेस का उपयोग करने से परेशान होने की आवश्यकता नहीं है। कक्षा। लेकिन फिर भी, यह सबसे सामान्य इंटरफ़ेस का उपयोग करने के लिए आपको नुकसान पहुंचा सकता है।
उपयोग करते समय मुख्य अंतर क्या हैं, और क्या मुद्दे अपेक्षित हैं,
- एक के साथ
Stringक्या आप जानते हैं कि आप पाठ के एक टुकड़े है, पूरी तरह से स्मृति में, और अपरिवर्तनीय है।
- ए के साथ
CharSequence, आपको नहीं पता कि कंक्रीट कार्यान्वयन की विशेष विशेषताएं क्या हो सकती हैं।
CharSequenceवस्तु पाठ का एक विशाल हिस्सा प्रतिनिधित्व कर सकते हैं, और इसलिए स्मृति प्रभाव पड़ता है। या अलग से ट्रैक किए गए पाठ के कई भाग हो सकते हैं जिन्हें आपको कॉल करने पर एक साथ सिलाई करने की आवश्यकता होगी toString, और इसलिए इसमें प्रदर्शन समस्याएं हैं। कार्यान्वयन एक दूरस्थ सेवा से पाठ को पुनर्प्राप्त कर सकता है, और इसलिए इसमें विलंबता निहितार्थ है।
और एक से दूसरे में परिवर्तित?
आप आम तौर पर आगे और पीछे परिवर्तित नहीं होंगे। ए String है ए CharSequence। अपने विधि घोषणा करता है कि यह एक लेता है CharSequence, बुला प्रोग्रामर एक पास कर सकते हैं Stringवस्तु, या एक के रूप में कुछ और इस तरह के पास कर सकते हैं StringBufferया StringBuilder। आपके विधि का कोड बस जो भी पारित किया जाता है, किसी भी CharSequenceतरीके का उपयोग करेगा।
यदि आप अपने कोड को प्राप्त करते हैं, तो आप निकटतम रूप से परिवर्तित हो जाएंगे CharSequenceऔर आपको पता होगा कि आपको इसकी आवश्यकता है String। शायद आपका इंटरफ़ेस के लिए लिखे जाने के Stringबजाय कक्षा के लिए लिखे गए पुराने कोड के साथ हस्तक्षेप कर रहा CharSequenceहै। या शायद आपका कोड पाठ के साथ गहन रूप से काम करेगा, जैसे बार-बार लूपिंग या अन्यथा विश्लेषण करना। उस स्थिति में, आप किसी भी संभावित प्रदर्शन को केवल एक बार हिट करना चाहते हैं, इसलिए आप toStringसामने बुलाते हैं । फिर अपने काम के साथ आगे बढ़ें जो आप जानते हैं कि पाठ का एक टुकड़ा पूरी तरह से स्मृति में है।
मुड़ इतिहास
स्वीकृत उत्तर पर की गई टिप्पणियों पर ध्यान दें । CharSequenceइंटरफ़ेस मौजूदा वर्ग संरचना पर retrofitted किया गया था, तो वहाँ कुछ महत्वपूर्ण बारीकियों (हैं equals()और hashCode())। जावा के विभिन्न संस्करणों (1, 2, 4 और 5) को देखें, जो पिछले कुछ वर्षों में कक्षाओं / इंटरफेसों पर काफी चर्चित रहे हैं। आदर्श रूप CharSequenceमें शुरुआत से ही होता है, लेकिन ऐसा ही जीवन है।
नीचे मेरा वर्ग आरेख आपको जावा 7/8 में स्ट्रिंग प्रकारों की बड़ी तस्वीर देखने में मदद कर सकता है। मुझे यकीन नहीं है कि ये सभी एंड्रॉइड में मौजूद हैं, लेकिन समग्र संदर्भ अभी भी आपके लिए उपयोगी साबित हो सकता है।
