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 में स्ट्रिंग प्रकारों की बड़ी तस्वीर देखने में मदद कर सकता है। मुझे यकीन नहीं है कि ये सभी एंड्रॉइड में मौजूद हैं, लेकिन समग्र संदर्भ अभी भी आपके लिए उपयोगी साबित हो सकता है।