比较Java

时间:2017-08-21 16:31:20

标签: java inheritance interface

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

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

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

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

3 个答案:

答案 0 :(得分:3)

你在问如何处理这种疾病的症状 - 我建议改为治愈根本原因:通过踩回来完全重构你的课程。

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

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

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

答案 1 :(得分: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的风险 - 确保它永远不会发生。

答案 2 :(得分:0)

通过特定字段比较不同类别的对象正是 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())));

看看,这可能会有用!