2010-01-15 14 views
7

मुझे java.lang.String जैसी ही विधियों के साथ एक कक्षा बनाने की आवश्यकता है।स्ट्रिंग क्लास प्रतिकृति कैसे बनाएं?

जावा में ऐसा करने का सबसे अच्छा तरीका क्या है?

मुझे पता है कि मैं स्ट्रिंग क्लास का विस्तार नहीं कर सकता क्योंकि यह final है। मैं समाधान नहीं देख रहा हूं जहां मुझे java.lang.String के स्रोत कोड की प्रतिलिपि बनाने की आवश्यकता है। उदाहरण के लिए, मान लीजिए कि मुझे MyString नामक मेरी कस्टम क्लास में कार्यक्षमता length() की आवश्यकता है, जिसमें एक 'myLength() `विधि है।

myLength() को लागू करने का सबसे अच्छा तरीका क्या है?

मैं स्ट्रिंग की लंबाई जानने के लिए विभिन्न एल्गोरिदम नहीं देख रहा हूं लेकिन String की length() विधि का पुन: उपयोग करने के लिए। अब मेरे पास MyString कक्षा तैयार होने के बाद, मुझे अपने कस्टम मैनिप्लेशंस के लिए कहीं भी इसका उपयोग करने में सक्षम होना चाहिए।

+7

वास्तविक समस्या क्या है जिसे आप हल करने का प्रयास कर रहे हैं? – ZoFreX

+0

मैं यह पता लगाने की कोशिश कर रहा हूं कि इस तरह की समस्या के लिए कौन सा डिज़ाइन पैटर्न सबसे उपयुक्त होगा। – Thunderhashy

+1

मैंने हमेशा सोचा, क्यों स्ट्रिंग जावा में अंतिम है? निश्चित रूप से, यह मुझे आवश्यक सभी कार्यक्षमता प्रदान करता है, और कभी भी ऑपरेशन के बारे में सोचा नहीं जाता है जिसके लिए कक्षा स्ट्रिंग के विस्तार की आवश्यकता होगी, लेकिन फिर भी आपको कभी पता नहीं चलेगा कि किसी को क्या चाहिए! – Alex

उत्तर

5

अपने प्रश्न यह बात आप के लिए देख रहे हैं की तरह लगता है से सरल delegation है:

class MyString { 

    String delegate; // The actual string you delegate to from your class 

    public MyString(String delegate) { 
    this.delegate = delegate; // Assign the string that backs your class 
    } 

    int length() { 
    return delegate.length(); // Delegate the method call to the string 
    } 

    // other methods that delegate to the string field 
} 
+0

यह अच्छा लग रहा है। लेकिन क्या मैं MyString strAbc = "यह मेरा स्ट्रिंग" कर सकता हूं? मैं स्ट्रिंग की एक सटीक प्रतिकृति की तलाश में हूं। आपके समाधान में, मुझे कन्स्ट्रक्टर में स्ट्रिंग को पास करने की आवश्यकता होगी। – Thunderhashy

+0

@ हर्ष, जो आप चाहते हैं वह बस संभव नहीं है। –

+0

@ पॉल क्या आप कृपया समझा सकते हैं? – Thunderhashy

2

एक नया वर्ग (यह एक अलग पैकेज की आवश्यकता होगी, ज़ाहिर है, एक ही इंटरफ़ेस को लागू करने और (स्ट्रिंग वर्ग से सभी सार्वजनिक तरीके जोड़ सुनिश्चित करें कि आप सब कुछ मिल गया) बनाने के लिए जावाडोक पढ़ा करें।

मैं ग्रहण करने के लिए इस होमवर्क है

8

के बाद से final कक्षाएं subclassed नहीं किया जा सकता, एकString उदाहरण के अंदर है कि एक नया वर्ग बना सकते हैं और इस वस्तु पर काम किया है।।

public class MyString { 
    private String s; 

    public MyString(String s) { 
    setInternalString(s); 
    } 

    public int myLength() { 
    return getInternalString().length(); 
    } 

    private void setInternalString(String s) { 
    this.s = s; 
    } 

    private String getInternalString() { 
    return this.s == null ? "" : this.s; 
    } 
} 
+2

प्रतिनिधिमंडल बुलाया। –

3

मुझे लगता है कि आपका मतलब java.lang.String है। हालांकि, आप अपनी खुद की कक्षा के साथ String को प्रतिस्थापित नहीं कर सकते हैं। आप एक ही तरीके के साथ एक और वर्ग बना सकते हैं (स्रोत कोड की प्रतिलिपि बनाकर और पैकेज घोषणा को बदलकर), लेकिन आप उस वर्ग के उदाहरणों को String की आवश्यकता के अनुसार पारित नहीं कर पाएंगे।

जो एक महत्वपूर्ण सवाल उठाता है: आपको ऐसा क्यों लगता है कि आप ऐसा करना चाहते हैं?

+0

मैं स्ट्रिंग क्लास से सभी विधियों की प्रतिलिपि बनाकर कक्षा बनाना नहीं चाहता हूं। इस सवाल से मुझे एक साक्षात्कार में पूछा गया था। – Thunderhashy

+3

शायद यह एक चाल सवाल था, और आपको उन्हें समझाया गया था कि ऐसा करने से आप लगभग हमेशा जावा एपीआई के साथ इंटर-ऑपरेटिंग से रोकेंगे। – erickson

+1

साक्षात्कार का एक और जवाब यह इंगित करेगा कि स्ट्रिंग CharSequence लागू करता है और आप अन्य कार्यान्वयन बना सकते हैं। बेशक, इससे मदद नहीं मिलती है अगर एआरआईएसएएस स्ट्रिंग का उपयोग करने वाले एपीआई को CharSequence की बजाय स्ट्रिंग की आवश्यकता होती है। –

0

यदि आप स्ट्रिंग व्यवहार के एक हिस्से को ओवरराइड करना चाहते हैं तो आप गतिशील प्रॉक्सी का उपयोग करने का प्रयास कर सकते हैं। एपीआई में java.lang.reflect.Proxy देखें।

+0

अंतर्निहित गतिशील प्रॉक्सी समर्थन केवल इंटरफेस के साथ काम करता है। एएसएम और अन्य बाइटकोड पुस्तकालय कक्षाओं के साथ काम कर सकते हैं, लेकिन मुझे अंतिम कक्षाओं के बारे में निश्चित नहीं है। – erickson

3

Proxy डिजाइन पैटर्न, मुझे लगता है। यह एक बेवकूफ सवाल है, हालांकि (पूछताछ पर प्रतिबिंब नहीं, बल्कि उस व्यक्ति पर जिसने उसे नौकरी साक्षात्कार में पूछा)। शायद आपको पूछने वाले व्यक्ति को यह एहसास नहीं हुआ कि स्ट्रिंग अंतिम है? अन्यथा मैं नहीं सोच सकता कि वे क्यों पूछेंगे।

+1

मुझे लगता है कि वास्तविक चुनौती इस तथ्य में निहित है कि स्ट्रिंग अंतिम है। अन्यथा इसका जवाब बहुत आसान है? बस स्ट्रिंग का विस्तार करें और आप के साथ किया जाता है। – Thunderhashy

1

आप रिफैक्टरिंग उपयोग कर सकते हैं: एक उदाहरण चर बनाने के लिए Replace inheritance with delegation, जो मूल रूप से (के रूप में पिछले जवाब में दिखाया गया है) है वांछित प्रकार के और नई कक्षा में अपने सभी तरीकों को लागू करने और उन्हें संदेश पास करने के लिए।

सुपरक्लास के लिए एक फ़ील्ड बनाएं, सुपरक्लास में प्रतिनिधि के लिए विधियों को समायोजित करें, और सबक्लासिंग को हटा दें।

https://www.refactoring.com/catalog/repInherWithDel.gif

आप इस लिखने का बहुत सा है पर ध्यान देंगे, कि जब एक अच्छा आईडीई काम आता है।

निम्नलिखित वीडियो दिखाता है कि इंटेलिजे आईडीईए 9 कैसे करता है।

http://img43.imageshack.us/img43/5647/capturadepantalla201001k.png

8

यहाँ विभिन्न जवाब के माध्यम से जा रहे हैं, और askers अद्यतन और स्पष्टीकरण ऐसा लगता है कि क्या प्रश्नकर्ता चाहता है एक वर्ग है कि, लग रहा है बदबू आ रही है और एक स्ट्रिंग की तरह लगता है, लेकिन नहीं है।

वे ऐसा करने में सक्षम होना चाहते हैं है:,,

MyString string = "String!!"; 

यह काम नहीं कर सकता, क्योंकि java.lang.String एक अंतिम वर्ग है, और इसलिए हर "String" कि संकलक का उत्पादन एक java.lang.String वस्तु हो जाएगा के बाद से इस है MyString ऑब्जेक्ट नहीं, उन्हें एक-दूसरे को असाइन नहीं किया जा सकता है।

कमजोर टाइप की गई भाषाओं में आप ऐसी कक्षा बनाने में सक्षम होंगे, क्योंकि यदि कोई वर्ग दिखता है, गंध करता है और duck की तरह लगता है, तो सभी उद्देश्यों और उद्देश्यों के लिए, यह एक बतख है। हालांकि, जावा एक दृढ़ता से टाइप की गई भाषा है, और एक बतख केवल एक बतख है यदि यह Anatidae family of birds से होता है।

+0

+1 यह सच है। SO उपयोगकर्ता ने स्ट्रिंग प्रतिकृति के लिए कहा है, न कि एक प्रतिनिधि, जहां एक प्रतिनिधि अभी भी स्ट्रिंग ऑब्जेक्ट बनायेगा। –

संबंधित मुद्दे