효과적인 자바에 대한 언급은 많은 신뢰성을 추가하는 것으로 보이므로이 답변은 다음과 같습니다.
- 효과적인 Java 항목 8 : 동일 항목을 재정의 할 때 일반 계약 준수
- 효과적인 Java 항목 9 : equals를 재정의 할 때 항상 hashCode를 재정의하십시오.
- 효과적인 Java 항목 15 : 변경 가능성 최소화
이 이름 객체의 인스턴스가 두 개 이상인 경우 한 단계 뒤로 물러서서 왜 관심이 있는지 궁금합니다.
이런 종류의 객체 풀링을 거의 할 필요가 없습니다. OP 가이 작업을 수행하고 있기 때문에 Name
객체와 단순히 객체를 비교할 수 있습니다 ==
. 또는 키와 비슷한 Name
내부 의 객체를 사용하십시오 HashMap
.
그렇다면 이것은의 적절한 구현을equals()
통해 해결할 수있는 것입니다 .
이렇게 :
public final class Name {
private final String name;
public Name(String name) {
if (name == null) {
name = ""; //or exception if you like
}
this.name = name;
}
public String getName() {
return name;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Name)) {
return false;
}
Name other = (Name) o;
return other.name.equals(name);
}
@Override
public int hashCode() {
return name.hashCode();
}
}
완료되면 다음이 적용됩니다.
Name a = new Name("weston");
Name b = new Name("weston");
assert(a.equals(b)); //same but:
assert(a!=b); //not the same instance
//test out the Name instances in a hashmap:
HashMap<Name,Object> map = new HashMap<Name,Object>();
Object detailsIn = new Object();
map.put(a,detailsIn);
Object detailsOut = map.get(b);
assert(detailsIn==detailsOut); //the map returned the same details object
//even though we put with `a` and got with `b` thanks to our correct equals implementation
나는 당신의 목표를 추측하고 있지만,이 방법 Name
으로 해시 맵 등에서 클래스를 사용할 수 있으며 정확히 같은 인스턴스 일 필요는 없습니다 .