Java等于第三部分类的可配置字段数
我必须实现一个测试对象相等性的方法,如下所示Java等于第三部分类的可配置字段数,java,Java,我必须实现一个测试对象相等性的方法,如下所示 isEqual(MyClass o1, MyClass o2, List<String> fieldNames) isEqual(MyClass o1、MyClass o2、列表字段名) 这里的列表字段名是MyClass的实例变量,应该考虑这些变量是否相等 isEqual方法将从具有不同“字段名集”的不同代码路径调用 我查看了Apache EqualBuilder,但它没有提供我正在寻找的类似功能 有什么建议吗?试试MyClass.c
isEqual(MyClass o1, MyClass o2, List<String> fieldNames)
isEqual(MyClass o1、MyClass o2、列表字段名)
这里的列表字段名
是MyClass
的实例变量,应该考虑这些变量是否相等
isEqual
方法将从具有不同“字段名集
”的不同代码路径调用
我查看了Apache EqualBuilder,但它没有提供我正在寻找的类似功能
有什么建议吗?试试
MyClass.class.getDeclaredFields()
这将得到一个类中所有字段的列表。您可以使用field.getName()
来获取其字符串
-name
接下来在isEqual()
中,您可以使用MyClass.class.getField(fieldName)
来获取字段。使用field.get(myClass)
可以获取某个实例的此字段的值
虽然我没有传递字段名,而是传递字段[]
。这将跳过将字段
转换为字符串
,然后再转换回字段
如果您想进一步了解这一点,请看一下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);
}
公共布尔值等于(MyClass class1、MyClass class2、class2这会起作用,但您不会暴露这会导致的性能问题;此外,类没有“get”方法;您的意思是getFieldWell,这似乎是OP要求的情况。我怀疑他想基于UI生成字段列表。这意味着编写自定义比较器s而不使用反省是不可能的。无论哪种情况,OP都需要认真考虑后果。我真的不认为可以有一个比较任何领域的场景,不管是在UI中。无论是在UI中,还是比较小的,MyClass都有15个字段,而我将MyClass暴露给其他开发者来提供数据给我的代码。字段向我发送数据。我需要找出他们最近发送的数据是否与上次发送的数据不同。这就是为什么我想从他们那里获取一个字段列表,并使用这些字段来比较MyClass的cur和prev实例。替代方法是让他们中的每一个人编写自定义比较表MyClass的任务大纲