-CaseInsensitiveString이 String처럼 동작하도록하려면 어떻게해야 위의 문장이 괜찮을까요 (String 확장 여부에 관계없이)? 리터럴을 그대로 전달할 수 있도록하는 것은 String에 대해 무엇입니까? 내 이해에서 Java에는 "복사 생성자"개념이 없습니까?
첫 번째 요점부터 충분하다고 말했습니다. "Polish"는 문자열 리터럴이며 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();
}
// "assert"키워드를 사용하여 클래스 테스트
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 개체의 내부 풀을 만들고 거기에서 해당 인스턴스를 반환합니다.
이렇게하면 "=="연산자는 동일한 값을 나타내는 두 개체 참조에 대해 true 를 반환 합니다 .
이것은 유사한 객체가 매우 자주 사용되고 생성 비용이 비쌀 때 유용합니다.
문자열 클래스 문서에는 클래스가 내부 풀을 사용한다고 명시되어 있습니다.
클래스가 완전하지 않습니다. CharSequence 인터페이스를 구현할 때 객체의 내용을 살펴 보려고 할 때 몇 가지 흥미로운 문제가 발생하지만이 코드는 Book의 해당 항목이 어떻게 적용될 수 있는지 보여주기에 충분합니다.
사용하여 해당 통지하는 것이 중요합니다 internalPool의 객체를 참조가 해제되지 않습니다 때문에없는 쓰레기 수집 및 개체의 많은이 생성되는 경우 그 문제가 될 수 있습니다.
집중적으로 사용되고 풀이 "인턴 된"객체로만 구성되기 때문에 String 클래스에서 작동합니다.
가능한 값이 두 개뿐이기 때문에 Boolean 클래스에서도 잘 작동합니다.
마지막으로 이것이 Integer 클래스의 valueOf (int) 가 -128에서 127 int 값으로 제한되는 이유이기도 합니다.