効果的なJavaの言及は多くの信頼性を追加するように思われるので、この回答は次の点に基づいています。
- 有効なJava項目8:等しいをオーバーライドする場合は、一般的な契約に従います
- 効果的なJavaアイテム9:等しいをオーバーライドするときは常に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
ではハッシュマップなどでクラスを使用できます。それらはまったく同じインスタンスである必要はありません。