当前位置: 首页 > 面试题库 >

比较几个javabean属性的最佳方法是什么?

乐修远
2023-03-14
问题内容

我需要比较两个对象(同一类的实例)中的许多字段,并做一些记录和更新,以防出现差异。元代码可能看起来像这样:

if (a.getfield1 != b.getfield1)
  log(a.getfield1 is different than b.getfield1)
  b.field1 = a.field1

if (a.getfield2!= b.getfield2)
  log(a.getfield2 is different than b.getfield2)
  b.field2 = a.field2

...

if (a.getfieldn!= b.getfieldn)
  log(a.getfieldn is different than b.getfieldn)
  b.fieldn = a.fieldn

具有所有比较的代码非常简洁,我想以某种方式使其更紧凑。如果我有一个方法可以将setter和getter的调用作为参数并在所有字段中调用,那将是很好的,但是不幸的是,这对于Java是不可能的。

我提出了三个选择,每个选择都有其自身的缺点。

1.使用反射API来找出getter和setter的
丑陋情况,如果字段名称发生更改,可能会导致运行时错误

2.将字段更改为公共字段,并直接使用它们而不使用getter和setters也很
丑陋,并且会将类的实现暴露给外部世界

3.让包含类(实体)进行比较,更新更改的字段并返回日志消息
实体不应参与业务逻辑

所有字段都是String类型,如果需要,我可以修改拥有这些字段的类的代码。

编辑:类中的某些字段不能进行比较。


问题答案:

使用注释。

如果您标记了需要比较的字段(无论它们是否是私有的,您仍然不会丢失封装,然后获取这些字段并进行比较。可能如下:

在需要比较的类中:

@ComparableField 
private String field1;

@ComparableField
private String field2;

private String field_nocomparable;

并在外部类中:

public <T> void compare(T t, T t2) throws IllegalArgumentException,
                                          IllegalAccessException {
    Field[] fields = t.getClass().getDeclaredFields();
    if (fields != null) {
        for (Field field : fields) {
            if (field.isAnnotationPresent(ComparableField.class)) {
                field.setAccessible(true);
                if ( (field.get(t)).equals(field.get(t2)) )
                    System.out.println("equals");
                field.setAccessible(false);
            }
        }
    }
}

该代码未经测试,但请告诉我是否有帮助。



 类似资料:
  • 问题内容: 在Python中处理此问题的推荐方法是什么? 当然在某个地方有一个标准的库函数吗? 问题答案: Python 3.5添加了PEP 485中描述的和功能。 如果你使用的是Python的早期版本,则等效功能在文档中给出。 是一个相对容差,它乘以两个参数中的较大者;当值变大时,它们之间的允许差异也会变大,同时仍将它们视为相等。 是在所有情况下均按原样应用的绝对公差。如果差异小于这些公差中的任

  • 问题内容: 在Python中,比较float与几乎相等的最佳方法是什么? 问题答案: Python 3.5添加了PEP 485中描述的和功能。 如果你使用的是Python的早期版本,则等效功能在文档中给出。 是一个相对容差,它乘以两个参数中的较大者;当值变大时,它们之间的允许差异也会变大,同时仍将它们视为相等。 是在所有情况下均按原样应用的绝对公差。如果差异小于这些公差中的任何一个,则认为值相等。

  • 我的应用程序是关于艺术家画墙壁的。 在这一点上,艺术家有许多墙,墙属于艺术家。 但现在我想使可能的一面墙归属许多艺术家。( 我想不出解决这个问题的最好办法。那么: 1-一个旋转台:艺术家的墙壁,那里有许多艺术家和艺术家的墙壁 •可能吗?还是双方都必须有自己的关系? • 2-我的墙表中的艺术家ID数组 •那么我想我会失去这段雄辩关系的好处 看起来很脏 有什么经验可以分享吗?够清楚吗?我用的是拉威尔5

  • 问题内容: 哪种方法可以更好地检查属性是否存在? Jarret Hardie提供了以下答案: 我看到它也可以通过以下方式完成: 一种方法通常比其他方法使用更多吗? 问题答案: 没有“最佳”方法, 因为您永远不会仅仅检查属性是否存在;它始终是某些较大程序的一部分。有几种正确的方法,一种值得注意的不正确的方法。 这是演示此技术失败的演示: 输出: 大多数情况下,您不想惹恼。这是用于执行特殊操作的特殊属

  • 问题内容: 我正在尝试编写一个应用程序的自动化测试,该测试基本上将自定义消息格式转换为XML消息并将其发送到另一端。我有一组不错的输入/输出消息对,所以我要做的就是将输入消息发送进去,并听XML消息传到另一端。 当需要将实际输出与预期输出进行比较时,我遇到了一些问题。我的第一个想法只是对预期消息和实际消息进行字符串比较。这不能很好地工作,因为我们拥有的示例数据并不总是保持一致的格式,并且常常为XM

  • 问题内容: 您如何建议完成此任务? 我所面临的挑战是智能呈现差异信息。在我重新发明轮子之前,是否有一种公认的方法来处理这种比较? 问题答案: 您可以尝试XStream的体系结构,处理JSON映射 另外,请看一下这篇文章:比较两个XML文件并在C#中使用XMLDiff生成第三个文件。它在C#中,但是逻辑是相同的。