我有这样的问题,我在我的应用程序中以两种不同的方式填充对象。 所以有时可能发生,一个有一些空字段,而第二个没有。 我想比较这两个对象,当一个对象具有空值的字段时,此字段将被排除在比较之外。 有没有人知道如何在实践中做到这一点? 对我来说最好的方法是使用一些伪方法()方法模板,我可以使用它来编写代码,就像在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;
}
有没有人能告诉我如何创建这样一个模板的方式,甚至更好的人有一个? :) 感谢。
答案 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)
编辑:更多想法:
depends
。当然,如果您愿意,可以为IntelliJ IDEA编写一个插件,为您生成代码。可能有点矫枉过正吗?