- मैं कैसे कर सकता हूं CaseInsensitiveString स्ट्रिंग की तरह व्यवहार करता है इसलिए उपरोक्त कथन ठीक है (स्ट्रिंग का विस्तार करने के साथ और w / बाहर)? यह स्ट्रिंग के बारे में क्या है जो इसे सिर्फ एक शाब्दिक रूप से पारित करने में सक्षम बनाता है? मेरी समझ से जावा सही में कोई "कॉपी कंस्ट्रक्टर" अवधारणा नहीं है?
पहले बिंदु से पर्याप्त कहा गया है। "पोलिश" एक स्ट्रिंग शाब्दिक है और CaseInsentiviveString वर्ग को नहीं सौंपा जा सकता है।
अब दूसरे बिंदु के बारे में
यद्यपि आप नए शब्द नहीं बना सकते हैं, आप "समान" दृष्टिकोण के लिए उस पुस्तक के पहले आइटम का अनुसरण कर सकते हैं, इसलिए निम्नलिखित कथन सत्य हैं:
CaseInsensitiveString cis5 = CaseInsensitiveString.valueOf("sOmEtHiNg");
CaseInsensitiveString cis6 = CaseInsensitiveString.valueOf("SoMeThInG");
assert cis5 == cis6;
assert cis5.equals(cis6);
यहाँ कोड है।
C:\oreyes\samples\java\insensitive>type CaseInsensitiveString.java
import java.util.Map;
import java.util.HashMap;
public final class CaseInsensitiveString {
private static final Map<String,CaseInsensitiveString> innerPool
= new HashMap<String,CaseInsensitiveString>();
private final String s;
public static CaseInsensitiveString valueOf( String s ) {
if ( s == null ) {
return null;
}
String value = s.toLowerCase();
if ( !CaseInsensitiveString.innerPool.containsKey( value ) ) {
CaseInsensitiveString.innerPool.put( value , new CaseInsensitiveString( value ) );
}
return CaseInsensitiveString.innerPool.get( value );
}
public CaseInsensitiveString(String s){
if (s == null) {
throw new NullPointerException();
}
this.s = s.toLowerCase();
}
public boolean equals( Object other ) {
if ( other instanceof CaseInsensitiveString ) {
CaseInsensitiveString otherInstance = ( CaseInsensitiveString ) other;
return this.s.equals( otherInstance.s );
}
return false;
}
public int hashCode(){
return this.s.hashCode();
}
// "जोर" कीवर्ड का उपयोग करके कक्षा का परीक्षण करें
public static void main( String [] args ) {
CaseInsensitiveString cis1 = new CaseInsensitiveString("Polish");
CaseInsensitiveString cis2 = new CaseInsensitiveString("Polish");
assert cis1 != cis2;
assert cis1.equals(cis2);
CaseInsensitiveString cis3 = CaseInsensitiveString.valueOf("Polish");
CaseInsensitiveString cis4 = CaseInsensitiveString.valueOf("Polish");
assert cis3 == cis4;
assert cis3.equals(cis4);
CaseInsensitiveString cis5 = CaseInsensitiveString.valueOf("sOmEtHiNg");
CaseInsensitiveString cis6 = CaseInsensitiveString.valueOf("SoMeThInG");
assert cis5 == cis6;
assert cis5.equals(cis6);
CaseInsensitiveString cis7 = CaseInsensitiveString.valueOf("SomethinG");
CaseInsensitiveString cis8 = CaseInsensitiveString.valueOf("someThing");
assert cis8 == cis5 && cis7 == cis6;
assert cis7.equals(cis5) && cis6.equals(cis8);
}
}
C:\oreyes\samples\java\insensitive>javac CaseInsensitiveString.java
C:\oreyes\samples\java\insensitive>java -ea CaseInsensitiveString
C:\oreyes\samples\java\insensitive>
यही है, CaseInsensitiveString ऑब्जेक्ट्स का एक आंतरिक पूल बनाएं, और वहां से कॉरस्पॉन्डिंग उदाहरण को वापस करें।
इस तरह "==" ऑपरेटर एक ही मान का प्रतिनिधित्व करने वाली दो वस्तुओं के संदर्भ के लिए सही हो जाता है ।
यह उपयोगी है जब समान वस्तुओं का बहुत बार उपयोग किया जाता है और लागत पैदा करना महंगा होता है।
स्ट्रिंग क्लास प्रलेखन में कहा गया है कि वर्ग एक आंतरिक पूल का उपयोग करता है
वर्ग पूरा नहीं होता है, कुछ दिलचस्प मुद्दे उठते हैं जब हम चारसेंसेंस इंटरफ़ेस को लागू करने पर ऑब्जेक्ट की सामग्री को चलने की कोशिश करते हैं, लेकिन यह कोड यह दिखाने के लिए पर्याप्त है कि बुक में उस आइटम को कैसे लागू किया जा सकता है।
यह ध्यान रखना महत्वपूर्ण है कि आंतरिकपूल ऑब्जेक्ट का उपयोग करके , संदर्भ जारी नहीं किए जाते हैं और इस प्रकार संग्रहणीय कचरा नहीं होता है, और यह एक मुद्दा बन सकता है यदि बहुत सारी वस्तुएं बनाई जाती हैं।
यह स्ट्रिंग वर्ग के लिए काम करता है क्योंकि इसका उपयोग गहनता से किया जाता है और पूल को "इंटर्न" ऑब्जेक्ट के लिए ही गठित किया जाता है।
यह बूलियन वर्ग के लिए भी अच्छा काम करता है, क्योंकि केवल दो संभावित मूल्य हैं।
और आखिरकार यही कारण है कि क्लास इंटेगर में valueOf (int) , -128 से 127 int मान तक सीमित है।