0

我必须实现一个方法来测试对象相等性如下

isEqual(MyClass o1, MyClass o2, List<String> fieldNames)

以下是应该考虑相等List<String> fieldNames的实例变量。MyClass

isEqual方法将从具有不同“ fieldNames”集的不同代码路径调用。

我查看了 Apache EqualsBuilder,但它没有提供我正在寻找的类似功能。

有什么建议么?

4

2 回答 2

0

尝试MyClass.class.getDeclaredFields()

这将为您提供一个类中所有字段的列表。您可以使用field.getName()来获取它的String-name。

接下来,您isEqual()可以使用MyClass.class.getField(fieldName)该字段来获取字段。用field.get(myClass)你可以得到某个实例的这个字段的值。

虽然我不会通过 fieldNames,而是通过Field[]. 这会跳过FieldtoString和 back to的转换Field

如果您想了解更多相关信息,请查看ReflectionJava。

祝你好运!

例子

boolean isEqual(MyClass obj1, MyClass obj2, Field[] fields) {
    for(Field field : fields)
        if(!field.get(obj1).equals(field.get(obj2)))
            return false;
    return true;
}

调用它:

Class cls = MyClass.class;
isEqual(obj1, obj2, { cls.get("myField"), cls.get("anotherField") });
于 2013-05-05T15:50:59.383 回答
0

如果您没有预定义的“组”字段(案例)进行比较,则必须使用反射。然而,这将导致很大的开销,特别是如果要经常执行此操作。

但是,如果您确实有某些比较方案,我建议您为每种情况创建自定义比较器。

例如:

public interface MyComparator {
    boolean areEqual(MyClass class1, MyClass class2);
}

和一些场景实现:

public class MyNamesComparator implements MyComparator {
    public boolean areEqual(MyClass class1, MyClass class2) {
        return class1.getNames().equals(class2.getNames());
    }
}

在您的业务逻辑类中:

public boolean areEqual(MyClass class1, MyClass class2, Class<? extends MyComparator> comparatorClass) {
   return comparatorClass.newInstance().areEqual(class1, class2);
}

依此类推,适用于您希望的任何情况。我实际上很确定你不需要任何比较器,所以这种方法对你有用。

于 2013-05-05T15:57:00.420 回答