有效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
类在哈希映射等,并且它们并不必须是完全相同的实例。