在我正在工作的一个应用程序中,我发现他们正在考虑使用null id的两个对象是不同的,这是java中equals()方法的正确行为吗?
示例实现如下::
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj != null && obj instanceof A) {
A a = (A) obj;
// If the id is null then its considered as different object.
if (a.getId() != null && a.getId().equals(this.getId())) {
return true;
} else {
return false;
}
} else {
return false;
}
}
答案 0 :(得分:0)
我读这个的方式:传入对象的空ID使这两个对象不相等。这似乎是一个直截了当的理由;我无法说没有什么是平等的。
(哦,撇开:equals
实现实际上已经被破坏了。它需要在其他对象obj
之前传递它才能工作。)
答案 1 :(得分:0)
虽然它可能是错的,但它完全没问题。这意味着对于b = a.clone()
,a.equals(b) == true
会因ID是否为空而有所不同......
equals
的规则非常a.equals(b) == b.equals(a)
。
但请注意,因为您的方法实际上并未覆盖equals(Object)
,但正在定义一种不同的方法(我认为这只是一个错误的问题)。
答案 2 :(得分:0)
这种事情的最可能的应用是这些是插入数据库并从数据库中选择的对象。通常,在插入时,数据库将分配ID。
这意味着如果您有包含ID的对象,则它们位于数据库中。如果两个对象具有相同的ID,则它们都表示数据库中的同一行。
但是如果对象没有ID,那么你已经创建了它们,但还没有将它们插入到数据库中。如果你有两个没有ID的对象,那么这些对象最终将成为数据库中的两个不同的行。但就目前而言,它们只存在于您的应用程序中。尽管如此,如果它们是两个不同的对象,那么它们确实代表了两个不同的数据项 - 因此equals
应该为这两个对象返回false。