我的Java类代表数据库中的实体,我发现重写类的equals方法以按ID进行比较是可行的。例如,在我的Transaction类中,我有这段代码

@Override
public boolean equals(Object other){
    if (other == null) return false;
    if (other == this) return true;
    if (!(other instanceof Transaction))return false;
    Transaction otherTrans = (Transaction) other;
    if (id == null || otherTrans.id == null) return false;
    return id.equals(otherTrans.id);
}

现在对我来说,每个类都拥有相同的代码段,而只更改了类的名称,这似乎有点丑陋。我考虑过让我的类扩展一个父类(super class)MyEntity,在其中我可以编写上述方法,用instanceof Transaction之类的东西替换instanceof this.getClass(),但这似乎是不可能的。我还考虑过用instanceof MyEntity替换它,但这意味着即使两个对象属于不同的类,只要它们具有相同的id,也可以将它们视为相等。
还有其他办法吗?

最佳答案

您可以使用instanceof运算符的动态版本,这是ClassisInstance方法。


if (!(getClass().isInstance(other))) return false;

这不会阻止子类的实例在父类(super class)对象上测试equals,而是一种动态的方式来确保它是完全相同的类,即比较两个Class对象是否相等。
if (!(getClass().equals(other.getClass()))) return false;

关于java - 在不知道类型的情况下使用instanceof,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35280590/

10-12 17:13