加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – equals和hashCode的通用反射辅助方法

发布时间:2020-12-15 04:53:33 所属栏目:Java 来源:网络整理
导读:我正在考虑为equals和hashCode创建一个反射辅助方法. 在equals的情况下,helper方法将反射API查找到objectA的字段,并将它们与objectB的字段进行比较. 在hashCode的情况下,helper方法查看字段的反射API并在迭代循环中计算hashCode. 好消息是我不必担心我的equa
我正在考虑为equals和hashCode创建一个反射辅助方法.

>在equals的情况下,helper方法将反射API查找到objectA的字段,并将它们与objectB的字段进行比较.
>在hashCode的情况下,helper方法查看字段的反射API并在迭代循环中计算hashCode.

好消息是我不必担心我的equals或hashCode实现中缺少字段.
糟糕的是我猜表现.你怎么看待这个想法?请分享您的意见!

这是我的平等初稿:

public final class ReflectiveEqualsHelper {

public static boolean isEqual(final Object a,final Object b) {
    if (!isTypeEqual(a,b)) {
        return false;
    }

    Field[] fields = getFields(a);

    Object valueA;
    Object valueB;
    String fieldName;
    for (int i = 0; i < fields.length; i++) {
        fieldName = fields[i].getName();
        valueA = getValueByFieldName(a,fieldName);
        valueB = getValueByFieldName(b,fieldName);
        if (!compare(valueA,valueB)) {
            return false;
        }
    }
    return true;
}

@SuppressWarnings("rawtypes")
private static Field[] getFields(final Object o) {
    Class clazz = o.getClass();
    Field[] fields = clazz.getDeclaredFields();
    return fields;
}

private static Field getField(final Object o,final String name) {
    try {
        Field field = o.getClass().getDeclaredField(name);
        return field;
    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    }
}

private static Object getValueByFieldName(final Object o,final String name) {
    Field field = getField(o,name);
    field.setAccessible(true);

    try {
        Object value = field.get(o);
        field.setAccessible(false);
        return value;
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }

}

private static boolean areBothNull(final Object a,final Object b) {
    return (a == null && b == null);
}

private static boolean isTypeEqual(final Object a,final Object b) {
    if (areBothNull(a,b)) {
        return false;
    }

    return a.getClass().equals(b.getClass());
}

private static boolean compare(final Object a,final Object b) {
    if (a == null) {
        return false;
    } else if (b == null) {
        return false;
    }
    return a.equals(b);
}

}

public class ReflectiveEqualsHelperTest {

@Test
public void testIsEqual() {
    Vector a = new Vector(Long.valueOf(1L),3L);
    Vector b = new Vector(Long.valueOf(1L),3L);
    Vector c = new Vector(Long.valueOf(2L),3L);
    boolean testA = ReflectiveEqualsHelper.isEqual(a,b);
    boolean testB = ReflectiveEqualsHelper.isEqual(a,c);
    boolean testC = ReflectiveEqualsHelper.isEqual(b,c);
    assertTrue(testA);
    assertFalse(testB);
    assertFalse(testC);
}

class Vector {
    public static final int STATIC = 1;

    private Long x;
    private long y;

    public Vector(Long x,long y) {
        super();
        this.x = x;
        this.y = y;
    }

    public Long getX() {
        return x;
    }

    public void setX(Long x) {
        this.x = x;
    }

    public long getY() {
        return y;
    }

    public void setY(long y) {
        this.y = y;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((x == null) ? 0 : x.hashCode());
        result = prime * result + (int) (y ^ (y >>> 32));
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        return ReflectiveEqualsHelper.isEqual(this,obj);
    }
}

}

干杯,凯文

解决方法

看看 Apache Commons中的 EqualsBuilder,它是reflectionEquals方法.这个库还有一个 HashCodeBuilder很多其他有用的东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读