Java id为空的对象是否相同?

Java id为空的对象是否相同?,java,Java,在我正在工作的一个应用程序中,我发现他们认为两个具有空id的对象是不同的,这是java中equals()方法的正确行为吗 示例实现如下所示: public boolean equals(Object obj) { if (this == obj) { return true; } if (obj != null && obj instanceof A) { A a = (A) obj;

在我正在工作的一个应用程序中,我发现他们认为两个具有空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;
        }
}

我的理解是:传入对象的空ID使这两个对象不相等。这似乎是一个直截了当的理由;我不能说什么都不等于什么


(哦,还有一个旁白:
equals
实现实际上已经失败了。它需要先传入另一个对象
obj
,然后才能工作。)

这很好,但可能是错误的。这意味着对于
b=a.clone()
a.equals(b)==true
将根据id是否为空而变化

equals
的规则相当于
a.equals(b)==b.equals(a)


但是请注意,因为您所讨论的方法实际上并没有覆盖
equals(Object)
,而是定义了一个不同的方法(我假设这只是一个问题输入错误)。

这种方法最有可能的应用是,这些对象插入到数据库中,并从数据库中选择。通常,在插入时数据库会分配一个ID

这意味着,如果有ID为的对象,它们就在数据库中。如果两个对象具有相同的ID,则它们都表示数据库中的同一行


但是如果对象没有ID,那么您已经创建了它们,但还没有将它们插入数据库。如果您有两个这样的对象,都没有ID,那么它们最终将作为数据库中的两个不同行结束。但现在,它们只存在于您的应用程序中。尽管如此,如果它们是两个不同的对象,那么它们确实代表两个不同的数据项,因此
equals
应该为这两个对象返回false。

这是应用程序级别的决定。这是一种可能的实现——它取决于您想要实现什么。(我将其写成
返回a.getId()!=null和&a.getId().equals(this.getId())
不过。另外,编写
obj!=null&&obj instanceof A
是多余的,因为
instanceof
在第一个参数为null时返回
false
。thanx Jon Skeet您的答案似乎更容易理解。David Wallace它不会为null,但它的id将为null:):)谢谢大家的回答。仍然不完整-需要是
Object
类型的参数,最好命名为
obj
(因为这是您在代码中已有的约定)。@user3679652仍然不太正确;现在它是一个重载,而不是覆盖。