在不知道类型的情况下使用instanceof

spl*_*123 10 java instanceof dynamic-typing

我的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);
}
Run Code Online (Sandbox Code Playgroud)

现在,对我来说似乎有点难看,每个类都拥有相同的代码片段,只更改了类的名称.我想让我的类扩展一个超类MyEntity,我会编写上面的方法,替换instanceof Transaction为类似的东西instanceof this.getClass(),但这似乎不可能.我也想过用它代替它instanceof MyEntity,但这意味着两个对象可以被认为是相等的,即使它们属于不同的类,只要它们具有相同的id.还有其他方法吗?

rge*_*man 6

您可以使用动态版本的instanceof运营商,它ClassisInstance方法.

确定指定的Object是否与此Class表示的对象分配兼容.

if (!(getClass().isInstance(other))) return false;
Run Code Online (Sandbox Code Playgroud)

这不会阻止子类的实例equals在超类对象上进行测试,但是确保它是完全相同的类的动态方法是比较两个Class对象的相等性.

if (!(getClass().equals(other.getClass()))) return false;
Run Code Online (Sandbox Code Playgroud)