比较两个对象时如何排除空字段?

时间:2017-03-23 07:47:09

标签: java intellij-idea

我有这样的问题,我在我的应用程序中以两种不同的方式填充对象。 所以有时可能发生,一个有一些空字段,而第二个没有。 我想比较这两个对象,当一个对象具有空值的字段时,此字段将被排除在比较之外。 有没有人知道如何在实践中做到这一点? 对我来说最好的方法是使用一些伪方法()方法模板,我可以使用它来编写代码,就像在InteliJ中使用equals()和hashCode(),...生成器一样。 或者使用一些匹配器,但我找不到一个:/

class A {
T f1;
T f2;
T f3;
}

A a1 = new A(value1, value2, value3);
A a2 = new A(value1, null, value3);

a1.pseudoEquals(a2) =>真

所以我想在InteliJ中使用生成器模板来生成这样的东西:

public boolean pseudoEquals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        if (f1 == null && f2 == null && f3 == null) return false;

        A that = (A) o;
        if (that.f1 == null && that.f2 == null && that.f3 == null) return false;   

        if ((f1 != null && that.f1 != null) && !f1.equals(that.f1)) return false;
        if ((f2 != null && that.f2 != null) && !f2.equals(that.f2)) return false;
        if ((f3 != null && that.f3 != null) && !f3.equals(that.f3)) return false;

        return true;
    }

有没有人能告诉我如何创建这样一个模板的方式,甚至更好的人有一个? :) 感谢。

1 个答案:

答案 0 :(得分:0)

首先,你为什么要这样做?您可能需要三思而后行,public class MyObjects { public static boolean equalIfNotNull(Object attr1, Object attr2) { return attr1 == null || attr2 == null || attr1.equals(attr2); } } 是否是您真正想要解决的问题的最佳解决方案。你可能也想分享你的想法,周围有许多聪明的头脑给你建议。

如果你的意思是你所说的,那不仅仅是一个小辅助课的问题吗?

pseudoEquals()

现在在 return MyObjects.equalIfNotNull(f1, that.f1) && MyObjects.equalIfNotNull(f2, that.f2) && MyObjects.equalIfNotNull(f3, that.f3); 你可以做

MyObjects.pseudoEqual(this, that, A::getF1, A::getF2, A::getF3)

编辑:更多想法:

  • 使用varargs和方法引用可以使它更优雅:depends
  • 您可以使用一些反射魔法来检测您班级的所有实例字段并执行您需要的逻辑。

当然,如果您愿意,可以为IntelliJ IDEA编写一个插件,为您生成代码。可能有点矫枉过正吗?