JAVA对象一致性比较(属性值)

本文探讨了三种JAVA对象一致性比较方法:通过重写hashCode和equals方法,使用序列化比较对象,以及利用反射获取并比较对象属性。还提供了一个工具类实现反射比较,支持多种类型的数据比较。

JAVA对象一致性比较(属性值)

HashCode方法

该方法也是最为正规的方法,重写对象的hashCode与equals方法,可以实现对象间相等性比较的判断。

序列化方法

该方法是将A和B对象分为JSON序列化成字符串,利用字符串的来进行对象相等性比较。简单贴一下代码:

public static boolean seniorCompare(Object srcObject, Object dstObject) {
   
   
        if (srcObject == null && dstObject == null) {
   
   
            return true;
        }
        if (srcObject == null || dstObject == null) {
   
   
            return false;
        }
        if (srcObject == dstObject) {
   
   
            return true;
        }
        if (srcObject.getClass() != dstObject.getClass()) {
   
   
            return false;
        }

        try {
   
   
            String srcJson = JacksonJsonConverter.getInstance().serialize(srcObject);
            String dstJson = JacksonJsonConverter.getInstance().serialize(dstObject);
            boolean equals = srcJson.equals(dstJson);
            if (equals) {
   
   
                return true;
            } else {
   
   
                return false;
            }
        } catch (JacksonSerializeException e) {
   
   
            e.printStackTrace();
        }
        return false;
    }

反射比较

如果第一种方法无法成行,那该节介绍的反射则为常见的比较方式。通过反射获取对象的属性与值,依次进行数据的比较:
工具类主要实现判断对象是否一致和获取对象中不现的属性信息列表功能:

public List<BeanField> getDiffFields(Object first, Object second)
public List<BeanField> getDiffFields(Object first, Object second, List skipFields)
public boolean isEquals(Object first, Object second, List skipFields)
public boolean isEquals(Object first, Object second)

基本思路利用JAVA的反射,作了简单的封装,支持List/Map/基础类型/封装类型/复杂类型的比较。
代码如下:

package com.zte.sdn.oscp.topology.bean;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.Lists;

/**
 * @Author 10184538
 * @Date 2019/12/20 13:57
 **/
public class BeanHelper {
   
   

    private final Logger logger = LoggerFactory.getLogger(BeanHelper.class);

    public static final List<Class<?>> WRAPPER = Arrays.asList(Byte.class, Short.class,
            Integer.class, Long.class, Float.class, Double.class, Character.class,
            Boolean.class, String.class);

    private boolean isSimpleField(Object first, Object second) {
   
   
        Object obj = first == null ? second : first;
        Class<?> clazz = obj.getClass();
        return clazz.isPrimitive() || WRAPPER.contains(clazz);
    }

    private List<BeanField> compareSimpleField(Object first, Object second) {
   
   
        boolean eq = Objects.equals(first, second);
        if (eq) {
   
   
            return Collections.emptyList();
        } else {
   
   
            Object obj = first == null ? second : first;
            Class<?> clazz = obj.getClass();
            return Collections.singletonList(new BeanField(clazz.getSimpleName(), clazz, first, second));
        }
    }

    private boolean nullIsEquals(Object first, Object second) {
   
   
        if (first == null && second != null) {
   
   
            return false;
        }
        if (first != null && second == null) {
   
   
            return false;
        }
        return true;
    }

    public List<BeanField> getDiffFields(Object first, Object second, List<String> skipFields) {
   
   
        if (first == second) {
   
   
            return Collections.emptyList();
        }
        if (isSimpleField(first, second)) {
   
   
            return compareSimpleField(first, second);
        }
        Object obj = first == null ? second : first;
        Set<BeanField> diffField = new HashSet<>();
        for (Field field : getFields(obj)) {
   
   
            String fieldName = field.getName();
            if (skipFields != null && skipFields.contains(fieldName)) {
   
   
                continue;
            }
            try {
   
   
                field.setAccessible(true);
                Object firstVal = first == null ? null : field.get(first);
                Object secondVal = second == null ? null : field.get(second);
                if (firstVal == secondVal) {
   
   
                    continue;
                }
                BeanField fieldInfo = new BeanField(fieldName, field.getType(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值