gpt4 book ai didi

java - 关于对象比较

转载 作者:行者123 更新时间:2023-12-04 06:57:56 25 4
gpt4 key购买 nike

我有一个 Java 类 Rec。我有两个实例 Rec1 和 Rec2。我想检查 Rec1 和 Rec2 的值是否相等。如果我做 Rec1.equals(Rec2) 是正确的做法吗?

class Rec {

private BigDecimal RecordId = null;

private BigDecimal recSubNum = null;

private BigDecimal FileId = null;

private String Category = null;

private BigDecimal status = null;

private BigDecimal errorCode = null;

}

最佳答案

您需要实现 equals()hashCode()在 Java 中实现对象相等的方法:

class Rec {
private BigDecimal recordId = null;
private BigDecimal recSubNum = null;
private BigDecimal FileId = null;
private String category = null;
private BigDecimal status = null;
private BigDecimal errorCode = null;

@Override
public int hashCode() {
int ret = 41;
ret = hc(ret, recordId);
ret = hc(ret, recSubNum);
ret = hc(ret, fieldId);
ret = hc(ret, category);
ret = hc(ret, status);
ret = hc(ret, errorCode);
return ret;
}

@Override
public boolean equals(Object ob) {
if (ob == null) return false;
if (ob.getClass() != Rec.class) return false;
Rec r = (Rec)ob;
if (!eq(r.recordId, record)) return false;
if (!eq(r.recSubNum, recSubNum)) return false;
if (!eq(r.fileId, fileId)) return false;
if (!eq(r.category, category)) return false;
if (!eq(r.status, status)) return false;
if (!eq(r.errorCode, errorCode)) return false;
return true;
}

private static boolean eq(Object ob1, Object ob2) {
return ob1 == null ? ob2 == null : ob1.equals(ob2);
}

private static int hc(int hc, Object field) {
return field == null ? hc : 43 + hc * field.hashCode();
}
}

注: Java 的 equals/hashCode 契约意味着对于任意两个对象 a 和 b:
a.equals(b) == b.equals(a)

如果两个对象相等,则 a.hashCode()必须等于 b.hashCode() .

编辑:有两种方法可以检查类型是否匹配。任何一个:
if (ob == null) return false;
if (ob.getClass() != Rec.class) return false;

或者
if (!(ob instanceof Rec)) return false;

这两个做不同的事情,你应该根据你想要做什么来选择正确的一个。我通常更喜欢第一个,除非你知道你需要第二个。有什么不同?
class A {
public int i;

public boolean equals(Object ob) {
if (!(ob instanceof A)) return false;
return i == ((A)ob).i;
}
}

看起来很合理吧?如果类被扩展怎么办:
class B extends A {
public int j;

public boolean equals(Object ob) {
if (!(ob instanceof B)) return false;
if (!super.equals(ob)) return false;
return j == ((B)ob).j;
}
}

看起来还是有道理的?它坏了。
A a = new A();
a.i = 10;
B b = new B();
b.i = 10;
b.j = 20;
System.out.println(a.equals(b)); // true! Is this really what you want?
System.out.println(b.equals(a)); // false! Different to previous = problem.

这就是为什么我喜欢 getClass()instanceof除非我真的想要子类平等。

关于java - 关于对象比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2315836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com