美文网首页
说说在 Java 中如何比较两个对象

说说在 Java 中如何比较两个对象

作者: deniro | 来源:发表于2021-11-22 22:01 被阅读0次

Common Lang 中的 Builder 包内提供了一个 DiffBuilder 类,可以比较两个对象,并返回不同的部分。

  1. 首先在要比较对象的类中实现 Diffable 接口,然后实现 DiffResult diff(T obj) 方法。
  2. DiffResult diff(T obj) 方法中,新建一个 DiffBuilder 对象,把需要比较的类属性一一放入 DiffBuilder 中。

DiffBuilder 的构造函数有三个入参,lhs 是当前对象,rhs 是要比较的对象,style 是比较结果输出的格式。

DiffBuilder(final T lhs, final T rhs,
        final ToStringStyle style)

假设有一个 Person 类定义了三个属性 name、age 和 smoker。以下是使用不同的 ToStringStyle 所对应的输出内容。

ToStringStyle 说明 输出
SHORT_PREFIX_STYLE 简短 Person[name=deniro,smoker=false] differs from Person[name=jack,smoker=true]
DEFAULT_STYLE 默认 org.apache.commons.lang3.builder.Person@9f70c54[name=deniro,smoker=false] differs from org.apache.commons.lang3.builder.Person@234bef66[name=jack,smoker=true]。
MULTI_LINE_STYLE 多行 org.apache.commons.lang3.builder.Person@9f70c54[
name=deniro
smoker=false
] differs from org.apache.commons.lang3.builder.Person@234bef66[
name=jack
smoker=true
]
NO_FIELD_NAMES_STYLE 不包含类属性名 org.apache.commons.lang3.builder.Person@9f70c54[deniro,false] differs from org.apache.commons.lang3.builder.Person@234bef66[jack,true]。
SIMPLE_STYLE 简洁 deniro,false differs from jack,true。
NO_CLASS_NAME_STYLE 不包含类名 [name=deniro,smoker=false] differs from [name=jack,smoker=true]。
JSON_STYLE JSON {"name":"deniro","smoker":false} differs from {"name":"jack","smoker":true}。

感觉 NO_CLASS_NAME_STYLE 与 JSON_STYLE 看的更清楚。

完整示例:

public class Person implements Diffable<Person> {

    private static final Logger log = LoggerFactory.getLogger(Person.class);

    String name;
    int age;
    boolean smoker;

    public DiffResult diff(Person obj) {
        // No need for null check, as NullPointerException correct if obj is null
        return new DiffBuilder(this, obj, ToStringStyle.SHORT_PREFIX_STYLE)
                .append("name", this.name, obj.name)
                .append("age", this.age, obj.age)
                .append("smoker", this.smoker, obj.smoker)
                .build();
    }

    public static void main(String[] args) {
        Person a = new Person();
        a.name = "deniro";
        a.age = 22;
        a.smoker = false;

        Person b = new Person();
        b.name = "jack";
        b.age = 22;
        b.smoker = true;

        DiffResult result = a.diff(b);
        log.info("result -> {}。", result);
    }
}

输出:

result -> Person[name=deniro,smoker=false] differs from Person[name=jack,smoker=true]。

如果是个大类,那么需要很多个 append 方法把这个大类的属性放到 DiffBuilder 中,不太方便。可以写个程序生成 DiffBuilder 初始化代码,或者尝试用反射来优化这部分代码。

参考资料

http://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html

相关文章

  • 说说在 Java 中如何比较两个对象

    Common Lang 中的 Builder 包内提供了一个 DiffBuilder 类,可以比较两个对象,并返回...

  • 比较

    java中,==号在比较基本数据类型时比较的是值,比较两个对象时比较的是两个对象的地址值 String类中的equ...

  • Java中如何遍历Map对象的4种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍...

  • Java中如何遍历Map对象的4种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍...

  • == , equals,hashCode

    在java中: == 是运算符,用于比较两个变量是否相等。 equals 是Objec类的方法,用于比较两个对象是...

  • Java 比较器 和 包装类

    Java比较器 背景: 在Java中经常会涉及到多个对象的排序问题,那么就涉及到对象之间的比较 Java中的对象,...

  • Java中==和equals的区别,equals和hashCod

    在java中: ==是运算符,用于比较两个变量是否相等。 equals,是Objec类的方法,用于比较两个对象是否...

  • Chapter 30《Object Equality》

    Scala中的相等性 Scala的相等性比较和Java中的不同,在Java中使用==表示两个对象的引用相等性,使用...

  • Java中对象的比较

    Java中要比较对象的大小或者要对对象的集合进行排序,需要通过比较这些对象的某些属性大小来确定它们之间的大小关系。...

  • Java中的对象比较

    一、对象的比较 在之前如果是两个数值的比较“==”,如果是字符串的比较一般用“equals()" 方法,这个方法是...

网友评论

      本文标题:说说在 Java 中如何比较两个对象

      本文链接:https://www.haomeiwen.com/subject/pukitrtx.html