java - Java中多字段比较对象-Python中的dict方法

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

最佳答案

如果你想编写处理每种类型的通用方法,你需要使用反射。如果您只想对一两个类型执行此操作,那么我建议您为每个单独的类型覆盖 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;
    }
}

关于java - Java中多字段比较对象-Python中的dict方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46138973/

相关文章:

java - P 作为泛型中的占位符

java - 在导航中实现左侧滑动菜单

python - 如何将 python 多处理与生成器一起使用?

python - 模板化数据流在加载时挂起一个多小时并因错误而退出

python - 为什么这不会导致 Python 中出现数组越界错误?

java - onActivityResult 有效!但我无法调试

java - 同步对象序列化(Android)

java - android mysql 与 java 代码没有响应

python - Linux:如何将命令行参数传递给传递给脚本的命令行参数?

python - 如何在 Mac 上指定路径