在python中,我们可以通过这种方法按属性比较对象:
def __eq__(self, other):
return self.__dict__ == other.__dict__
它允许我们按照属性比较对象,无论它们有多少属性。
在Java中这样的事情是可能的吗? 我试图以这种方式比较对象,但你必须按每个属性进行比较。是否有可能与上面的Python eq 方法类似?
public class MyClass {
public MyClass(attr1, attr2, attr3, attr4) {
this.attr1 = attr1;
this.attr2 = attr2;
this.attr3 = attr3;
this.attr4 = attr4;
}
public boolean equals(Object object2) {
return object2 instanceof MyClass &&
attr1.equals(((MyClass)object2).attr1)&&......;
}
}
答案 0 :(得分:3)
如果要编写处理每种类型的通用方法,则需要使用反射。如果你只是想用一两个类型做这个,那么我建议你为每个单独的类型覆盖equals
方法,即硬编码。
以下是编写接受每种类型的通用方法并比较字段是否相等的方法:
private static <T> boolean allFieldsEqual(T a, T b) throws IllegalAccessException {
Class<?> clazz = a.getClass();
Field[] fields = clazz.getFields();
for (Field field : fields) {
if (!field.get(a).equals(field.get(b))) {
return false;
}
}
return true;
}
逻辑非常明显。以下是用法:
Student s1 = new Student("Tom", 1);
Student s2 = new Student("Tom", 1);
try {
System.out.println(allFieldsEqual(s1, s2));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Student
定义为:
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}