【问题标题】:Compare object fields of different classes in Java比较Java中不同类的对象字段
【发布时间】:2017-08-21 16:31:19
【问题描述】:

我有两个对象,每个对象都有几十个字段:

Class1 {
    int firstProperty;
    String secondProperty;
    ...
}

Class2 {
    int propertyOne;
    String propertyTwo;
    ...
}

虽然某些字段名称不同,但它们应该具有相同的含义和用途,例如firstPropertypropertyOne。我想比较两个类的对象的“相似”字段是否实际上具有相同的值。 最优雅的方法是什么?

【问题讨论】:

  • 因为每个类都有一个对象?分享更多代码
  • 你想知道它们是一样的还是你想知道哪一个不同?
  • 你应该让Class1 & Class2 实现某种通用接口,为这些属性公开一个getter方法并比较该接口
  • @JeremyGrand 这正是我下面的方法
  • 我想我会用这个作为面试题 ;-)

标签: java inheritance interface


【解决方案1】:

您在问如何处理疾病的症状 - 我建议改为从根本上解决问题:退后一步并完全重构您的类。

具有“数十个”字段的类很可能违反单一职责原则

不要问自己如何比较字段 - 问问自己如何设计更多的类和更少的字段,实际上避免在多个地方拥有相同的信息!您应该(几乎)总是更喜欢由简单类组成的复杂网络,而不是由复杂类组成的简单网络。因为 class 是您的抽象的根,每个类应该 包含实现该类所涉及的one 事物所需的内容。

除此之外:没有简单的通用方法也不错。您当然可以编写一个使用反射比较对象的实用程序类 - 您只需提供变量名称,该实用程序代码就会进行通用比较。但是简单而通用 - 但不是 nice

【讨论】:

  • 在现实生活中,这并不总是可能的。例如,您可能会遇到由于库的循环依赖而无法重用所需类的情况。或者,您有上游和下游服务,它们根据独立的合同运行,由不同的供应商提供,他们不会接受您的任何“通用类”。如今是分布式系统的世界,而您的建议可以很容易地在某种单体中实现。
【解决方案2】:

有两个具有相似含义的字段的类,我会考虑声明一个interface

Class1 implements MyInterface {
    int firstProperty;
    String secondProperty;
    ...
    int getOne() {
        return firstProperty;
    }
    String getTwo() {
        return secondProperty;
    }

}

Class2 implements MyInterface {
    int propertyOne;
    String propertyTwo;
    ...
    int getOne() {
        return propertyOne;
    }
    String getTwo() {
        return propertyTwo;

    ...


}

还有一个interface,默认实现为isEqualTo

MyInterface {
    int getOne();
    String getTwo();
    ...

    boolean isEqualTo(MyInterface that) {
        return that != null &&
            this.getOne() == that.getOne() &&
            this.getTwo().equals(that.getTwo()) && //add null checks!

            ...;
    }
}

isEqualTo 存在被覆盖的风险 - 确保它永远不会发生。

【讨论】:

  • 假设 OP 不能真正分解他现有的课程,这将是解决他的问题的一种干净的方法 ;-)
  • 很好的解决方案。我喜欢它。
  • 我同意这个解决方案。稍微完善一下:在编码器不拥有一个(或两个)类的情况下,您可以为第 3 方类编写一个实现 MyInterface 的包装器。
【解决方案3】:

通过特定字段比较不同类的对象正是https://github.com/nejckorasa/compare-utils解决的场景。

例子:

ObjectCmp.equalEqualityPairs(
    object1,
    object2,
    Arrays.asList(
        EqualityPair.of(o1 -> o1.getFirstProperty(), o2 -> o2.getPropertyOne()),
        EqualityPair.of(o1 -> o1.getSecondProperty(), o2 -> o2.getPropertyTwo())));

看看吧,也许有用!

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多