【问题标题】:How to check two different classes attribute values are same如何检查两个不同的类属性值是否相同
【发布时间】:2023-03-22 11:17:01
【问题描述】:

如何检查具有相同属性的两个不同的类以不同的顺序具有相同的值

public class Person {
        String name;
        Long age;
        // getters and setters
        // equals and hashcode    
}

不同顺序的第二类属性

public class PersonTwo {            
            Long age;
            String name;

            // getters and setters
            // equals and hashcode    
    }

检查两个对象是否相等

        Person person = new Person();
        person.setAge(122L);
        person.setName("Paul");

        PersonTwo person2 = new PersonTwo();
        person2.setName("Paul");
        person2.setAge(122L);
        
        boolean result = Objects.equals(person2, person);

这将返回 false,不能在两个类中进行更改,因为它们来自另一个库。

除了比较每个属性值,还有什么简单的方法可以做到这一点?

【问题讨论】:

  • 您可以使用反射,因为 getter 在两个类中具有相同的名称,但是对于 2 个字段?只需手动比较字段:boolean result = Objects.equals(person2.getAge(), person.getAge()) && Objects.equals(person2.getName(), person.getName());
  • @fish 类的字段比较多,只是展示了一个例子,你能用反射来展示这个例子吗?
  • 真的是字段顺序的问题吗? - 因为我看不出有办法做到这一点,如果不是故意的话。还是PersonTwo.equals 包含if (obj instanceof PersonTwo) 之类的行?

标签: java java-11


【解决方案1】:

属性的顺序与这些对象的相等性无关。它们是不同的类,因此无论这些类的字段如何,Objects.equals(Object,Object) 都将返回 false,因为它使用第一个参数的 equals 方法在执行空比较后确定相等性。由于这两个类都是外部库的一部分,因此您无法更改其中任何一个的 equals 方法(这也很好,因为这是一个坏主意)。

您可以创建自己的Objects.equals(..) 版本来处理这种特定情况。更好的方法是将其中一个实例转换为另一种类型,然后您可以比较它们。但是,这假设 equals 已正确实施(由于它们来自外部库,因此您无法控制)。您还可以将它们都转换为您自己的类(MyPerson?),实现适当的等号,然后您就知道它会按预期运行。

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2023-03-13
    • 2011-06-22
    • 2014-06-11
    • 1970-01-01
    相关资源
    最近更新 更多