我必须实现一个方法来测试对象相等性如下
isEqual(MyClass o1, MyClass o2, List<String> fieldNames)
以下是应该考虑相等List<String> fieldNames
的实例变量。MyClass
isEqual
方法将从具有不同“ fieldNames
”集的不同代码路径调用。
我查看了 Apache EqualsBuilder,但它没有提供我正在寻找的类似功能。
有什么建议么?
我必须实现一个方法来测试对象相等性如下
isEqual(MyClass o1, MyClass o2, List<String> fieldNames)
以下是应该考虑相等List<String> fieldNames
的实例变量。MyClass
isEqual
方法将从具有不同“ fieldNames
”集的不同代码路径调用。
我查看了 Apache EqualsBuilder,但它没有提供我正在寻找的类似功能。
有什么建议么?
尝试MyClass.class.getDeclaredFields()
这将为您提供一个类中所有字段的列表。您可以使用field.getName()
来获取它的String
-name。
接下来,您isEqual()
可以使用MyClass.class.getField(fieldName)
该字段来获取字段。用field.get(myClass)
你可以得到某个实例的这个字段的值。
虽然我不会通过 fieldNames,而是通过Field[]
. 这会跳过Field
toString
和 back to的转换Field
。
如果您想了解更多相关信息,请查看Reflection
Java。
祝你好运!
例子
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") });
如果您没有预定义的“组”字段(案例)进行比较,则必须使用反射。然而,这将导致很大的开销,特别是如果要经常执行此操作。
但是,如果您确实有某些比较方案,我建议您为每种情况创建自定义比较器。
例如:
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);
}
依此类推,适用于您希望的任何情况。我实际上很确定你不需要任何比较器,所以这种方法对你有用。