2011-12-06 13 views
8

इंटरफ़ेस CharSequence का String.indexOf भाग बनाने में मुझे कोई कमी नहीं दिखाई दे रही है। लाभ यह होगा कि स्ट्रिंगबफर या स्ट्रिंगबिल्डर जैसे अन्य वर्गों को इंडेक्सऑफ विधियों को भी लागू करने की आवश्यकता होगी।इंटरफ़ेस CharSequence का हिस्सा स्ट्रिंग.इंडेक्स विधि क्यों नहीं है?

तो क्या कोई डिज़ाइन कारण है कि indexOf केवल String का हिस्सा होना चाहिए?

धन्यवाद।

+0

तो आप जो पूछ रहे हैं वह है: 'CharSequence' में' indexOf' विधि क्यों नहीं है? –

+1

स्ट्रिंगबफर और स्ट्रिंगबिल्डर के पास इंडेक्सऑफ विधियां हैं, हालांकि ... – Thilo

+0

@ थिलो - किस तरह की सवाल पूछती है कि CharSequence उस व्यवहार को क्यों निर्दिष्ट नहीं करता है? (और हालांकि java.nio.CharBuffer और javax.swing.text.Segment 'indexOf' को लागू नहीं करता है, वे आसानी से कर सकते हैं।) –

उत्तर

7

मुझे यकीन नहीं है कि इसके लिए क्या कारण है लेकिन मैं कक्षा का उदाहरण दे सकता हूं जो CharSequence लागू करता है। यह java.nio.CharBuffer है।

सैद्धांतिक रूप से यह indexOf() को लूप में charAt() पर कॉल करके कार्यान्वित कर सकता है। लेकिन यह काम नहीं करेगा क्योंकि उपयोगकर्ता अपेक्षा करता है। हम 2 स्थितियों के बीच अंतर नहीं कर सकते: चरित्र अभी तक नहीं है और चरित्र वहां नहीं है और वहां नहीं होगा। दूसरे मामले में indexOf() अनुबंध द्वारा -1 वापस करना चाहिए। पहले मामले में यह तब तक इंतजार करना चाहिए जब तक सभी बाइट आते हैं। लेकिन CharBuffer गैर-अवरुद्ध IO से संबंधित है, इसलिए यह अवरुद्ध नहीं हो सकता है।

मेरा मानना ​​है कि यह कम से कम संभावित कारण बताता है।

संपादित करें:

@Pacerier द्वारा बहुत ही मूल्यवान टिप्पणी के बाद मैं निम्नलिखित जोड़ना चाहते हैं। IMHO CharSequence एक बहुत ही सामान्य इंटरफेस के रूप में जो विभिन्न परिस्थितियों में उपयोग किया जाता है। इस इंटरफेस के सबसे प्रसिद्ध इंफोर्टर String, StringBuffer और StringBuilder हैं जो पूरी सामग्री को डेटा संरचना में रखते हैं जो किसी भी चरित्र तक सीधे पहुंच की अनुमति देता है। हालांकि यह सामान्य स्थिति में गलत है। java.nio.CharBuffer ऐसे मामले का एक उदाहरण है।

+0

वह घोड़े के सामने गाड़ी डाल रहा है। आपने केवल तर्क दिया कि CharBuffer CharSequence नहीं होना चाहिए, और यह नहीं कि सूचकांक CharSequence में नहीं होना चाहिए। – Pacerier

+1

@Pacerier, आपकी टिप्पणी के लिए धन्यवाद। कृपया मेरे उत्तर के अतिरिक्त एक नज़र डालें जो उम्मीद है कि घोड़े को आगे बढ़ाएगा। :) – AlexR

+0

ऐसा लगता है कि एक अलग इंटरफ़ेस होना चाहिए (जो दुखद नहीं है) इंडेक्सऑफ() विधियों को प्रदान करता है जो स्ट्रिंग और स्ट्रिंगबिल्डर दोनों लागू होते हैं, ताकि आप या तो एक विधि में पास कर सकें और आसानी से indexOf() को कॉल कर सकें इसका –

3

मुझे लगता है कि यह केवल एक निरीक्षण है, क्योंकि indexOf ऑपरेशन किसी भी प्रकार के अनुक्रम के लिए समझ में आता है।

2

जावा 8 इनमें से कुछ समस्याओं को हल कर सकता है। यह इंटरफेस पर डिफ़ॉल्ट कार्यान्वयन की अनुमति देगा। जैसे

interface List { 
    void sort() default Collections.sort(this); 
} 

इस अतिरिक्त तरीकों कि विधि लागू करने के लिए सभी इसको लागू करने के लिए एक बोझ रखने के बिना इंटरफेस के लिए जोड़ा जा करने के लिए अनुमति देते हैं।

+0

उदाहरण के लिए यह कैसे काम करेगा 'java.nio.CharBuffer' अगर एलेक्सआर ने अपने जवाब में उल्लेख किया है? 'IndexOf()' का एक डिफ़ॉल्ट कार्यान्वयन उस समस्या का समाधान नहीं करेगा जो उसने उल्लेख किया है। – Jesper

+1

यदि आप CharBuffer या StringBuilder या किसी म्यूटेबल ऑब्जेक्ट पर किसी विधि का उपयोग करते हैं, तो आपके पास इसके 'झूठी अब के लिए रिटर्न कोड नहीं है लेकिन यदि आप कुछ बदलते हैं तो सत्य हो सकता है'। यह समान रूप से 'सच हो सकता है लेकिन गलत अगर आप कुछ बदलते हैं' जैसे डेटा, स्थिति या सीमा बदल दी गई है। आप अभी क्या है इसके आधार पर आप केवल सच्चे/झूठे लौट सकते हैं। –