在Java中用多个字段比较对象 - Python中的dict方法

时间:2017-09-10 09:01:14

标签: java python

在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)&&......;
}
}

1 个答案:

答案 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;
    }
}