CharSequence को परिभाषित क्यों नहीं किया जाता है (CharSequence)?


11

यह अनुबंध के समान होने के कारण, जावा SE और Android दोनों पर लागू होता है।

CharSequenceएक contains(CharSequence)विधि को परिभाषित नहीं करता है । मुझे ऐसा कोई कारण नहीं मिल रहा है कि क्यों, और इसमें बहुत उपयोगी होगा, जिससे CharSequence#toString()पात्रों के अनुक्रम की जांच करने के लिए कॉल करने की आवश्यकता को रोका जा सके ।

उदाहरण के लिए, एंड्रॉइड में, उपयोगकर्ताओं को Editable#toString()यह देखने के लिए कॉल करने के लिए मजबूर किया जाता है कि क्या इसमें वर्णों का एक क्रम है, यद्यपि यह Editableलागू होता है CharSequence, जिसे CharSequenceपरिभाषित करने से बचा जा सकता है contains(CharSequence)

इस डिजाइन विकल्प के पीछे क्या विचार है? क्या यह एक संभावित निरीक्षण है, या इसके लिए कोई डिज़ाइन कारण है?

जवाबों:


10

मुद्दा CharSequenceयह है कि एक चरित्र अनुक्रम को केवल-पढ़ने के लिए दृश्य प्रदान करना है, और यह बात है। यह इंटरफ़ेस कोई स्ट्रिंग हेरफेर या खोज के तरीके प्रदान नहीं करता है। जो दायरे से बाहर हैं।

इंटरफ़ेस अलगाव सिद्धांत से पता चलता है कि एक प्रकार के ग्राहकों को उन तरीकों पर निर्भर नहीं होना चाहिए जो वे उपयोग नहीं करते हैं। इसलिए, एक इंटरफ़ेस को केवल न्यूनतम उपयोगी सेट घोषित करना चाहिए। यदि एक अलग उपयोग के मामले में अलग-अलग तरीकों की आवश्यकता है, तो एक अलग इंटरफ़ेस होना चाहिए।

एक क्लाइंट जिसे केवल एक चरित्र स्रोत की आवश्यकता होती है, उसे खोज विधियों की आवश्यकता नहीं होती है।

इस सिद्धांत को पूरा करना और एक हजार छोटे इंटरफेस के साथ समाप्त करना निश्चित रूप से संभव है। यह भी अच्छा नहीं है। इसलिए CharSequenceइंटरफ़ेस में न केवल न्यूनतम charAt()और length()विधियाँ शामिल हैं, बल्कि गहराई से संबंधित सुविधा विधि भी है subSequence()। (एक CharSequence संभावना एक स्ट्रिंग प्रति के बिना बाद में एक दृश्य प्रदान कर सकता है, यही कारण है कि यह एक उदाहरण विधि होना चाहिए)। निर्दिष्ट करना toString()ठीक है क्योंकि यह विधि वैसे भी विरासत में मिली होगी Object। तरीकों chars()और एक इंटरफ़ेस के लिए codePoints()अनुकूल है । क्योंकि ये डिफ़ॉल्ट तरीके हैं, वे लागू करने वाली कक्षाओं के लिए अतिरिक्त आवश्यकताओं को लागू नहीं करते हैं ।CharSequenceStreamCharSequence

CharSequenceजब एक विधि एक विशेष कार्यान्वयन को निर्दिष्ट (जैसे स्ट्रिंग बनाम CharBuffer बनाम StringBuilder) के बिना एक सामान्य चरित्र स्रोत की जरूरत है प्रकार उपयोगी है। String#join()और String#contains()तरीकों का उपयोग कर के अच्छे उदाहरण हैं CharSequenceरों।

यह CharSequenceएक contains()विधि प्रदान करने के लिए आवश्यक नहीं है क्योंकि इसे बाहरी रूप से लागू किया जा सकता है। जबकि जावा में C # एक्सटेंशन विधियों की सुविधा नहीं है, एक स्थिर विधि अनिवार्य रूप से एक ही बात है। इसलिए आपके बजाय boolean Editable#contains(CharSequence needle)static boolean contains(CharSequence haystack, CharSequence needle)स्ट्रिंग खोज एल्गोरिदम एक अच्छी तरह से अध्ययन किए गए कंप्यूटर विज्ञान विषय हैं। विभिन्न ट्रेडऑफ़ के साथ अलग-अलग एल्गोरिदम आसानी से उपलब्ध हैं।

आगे की पढाई:


2
आप का उल्लेख " इस इंटरफेस किसी भी स्ट्रिंग परिवर्तन या खोज के तरीकों प्रदान नहीं करता है। उन दायरे से बाहर हैं। ", लेकिन containsएक परिवर्तन तरीका नहीं है, और वहाँ है अस्तित्व खोज तरीकों ( charAt), तो यह कैसे लागू होता है ?. इसके अलावा, " क्योंकि ये डिफ़ॉल्ट विधियां हैं, वे CharSequence को लागू करने वाली कक्षाओं के लिए अतिरिक्त आवश्यकताओं को लागू नहीं करते हैं। " - containsलागू return to String().contains(...)करने के लिए कक्षाओं की आवश्यकता को हटाते हुए, इसे निहितार्थ के माध्यम से डिफ़ॉल्ट के रूप में लागू नहीं किया जा सकता है ?
विंस एमिघ

1
@VinceEmigh हाँ, contains()एक डिफ़ॉल्ट विधि हो सकती है। यदि यह अस्तित्व में है तो इसे String#containsदूसरे तरीके से लागू नहीं किया जाना चाहिए, लेकिन दूसरा तरीका: स्ट्रिंग को चारसेंसेन्स कार्यान्वयन का उपयोग करना चाहिए। charAt()अलग है। यह एक खोज एल्गोरिथ्म को लागू नहीं करता है, यह का एक महत्वपूर्ण हिस्सा है CharSequence: इसके बिना, सामग्री को एक अलग प्रकार में कॉपी नहीं किया जा सकता है String। स्ट्रीम Java8 का एक महत्वपूर्ण हिस्सा हैं, और इन डिफ़ॉल्ट तरीकों को जोड़ना अन्य इंटरफेस जैसे परिवर्धन के अनुरूप है Collection
आमोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.