- CaseInsensitiveString'in String gibi davranmasını nasıl sağlarım, böylece yukarıdaki ifade tamam olur (String genişletme ile ve olmadan)? String hakkında, onu böyle bire bir aktarabilmeyi uygun kılan nedir? Anladığım kadarıyla Java'da "kopya yapıcı" kavramı yok değil mi?
İlk noktadan yeterince söylendi. "Lehçe" değişmez bir dizedir ve CaseInsentiviveString sınıfına atanamaz.
Şimdi ikinci nokta hakkında
Yeni değişmez değerler oluşturamasanız da, bu kitabın ilk maddesini "benzer" bir yaklaşım için takip edebilirsiniz, böylece aşağıdaki ifadeler doğrudur:
CaseInsensitiveString cis5 = CaseInsensitiveString.valueOf("sOmEtHiNg");
CaseInsensitiveString cis6 = CaseInsensitiveString.valueOf("SoMeThInG");
assert cis5 == cis6;
assert cis5.equals(cis6);
İşte kod.
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();
}
// "assert" anahtar kelimesini kullanarak sınıfı test edin
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>
Yani, CaseInsensitiveString nesnelerinin dahili bir havuzunu oluşturun ve ilgili örneği oradan geri döndürün.
Bu şekilde "==" operatörü true değerini döndürür , aynı değeri temsil eden iki nesne başvurusu için değerini .
Bu, benzer nesneler çok sık kullanıldığında ve maliyet yaratmanın pahalı olduğu durumlarda kullanışlıdır.
Dize sınıfı dokümantasyonu, sınıfın kullandığını belirtir. bir iç havuz
Sınıf tamamlanmadı, CharSequence arayüzünü uygularken nesnenin içeriğini incelemeye çalıştığımızda bazı ilginç sorunlar ortaya çıkıyor, ancak bu kod Kitap'taki o öğenin nasıl uygulanabileceğini gösterecek kadar iyidir.
İnternalPool nesnesini kullanarak, referansların serbest bırakılmadığına ve dolayısıyla çöp toplama yapılamayacağına ve çok sayıda nesne oluşturulursa bunun bir sorun haline gelebileceğine dikkat etmek önemlidir.
Yoğun olarak kullanıldığından ve havuz yalnızca "interned" nesneden oluştuğundan String sınıfı için çalışır.
Boolean sınıfı için de işe yarar, çünkü yalnızca iki olası değer vardır.
Ve son olarak, Tamsayı sınıfındaki valueOf (int) 'nin -128 ila 127 int değerleriyle sınırlı olmasının nedeni de budur .