如何在使用jackson映射时适当地覆盖equals(Object o)

时间:2016-05-24 08:49:29

标签: java json jackson equals

JSON

"ABCD": [  
      {  
        "xyz": 3,  
        "abc": 4,  
        "date": {  
          "start": 1462341600000,  
          "stop": 1462513680000  
        }
      }
      ...similar sub parts
    ]

数据类型 已定义:我已尝试为json定义相应的数据类型,如下所示[忽略现在的其他字段]:

public class Test {
    TestDate testDate = new TestDate();
    private Long start = testDate.startTime;
    private Long stop  = testDate.expiryTime;

    public class TestDate {
        private Long startTime;
        private Long expiryTime;
        // getter and setter implemented here 
    }
}

现在,我感到困惑的是如何覆盖equals方法,以便检查JSON的开始停止参数。

案例1: 比较Test类中声明的变量startstop,并使用TestDate对应的参数进行分配。如:

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Test test = (Test) o;
        // Below is what I am concerned about
        if (stop != null ? !stop.equals(test.stop) : test.stop != null) return false;
        if (start != null ? !start.equals(test.start) : test.start != null) return false;
    }

OR

案例2: 只需使用Test类中创建的对象testDate进行比较。如:

if (testDate != null ? !testDate.equals(test.testDate) : test.testDate != null) return false;

怀疑

  • 案例2 是否满足案例1
  • 如果没有,那么差异是什么?
  • 如果是,哪一个是更好的做法?

在代码复杂性和可重用性方面寻找更多统计数据来解释为什么在案例1中使用案例2。

1 个答案:

答案 0 :(得分:1)

正确的方法是让Test关注自己的字段,所以它应该像你所做的那样对o进行检查,但在我看来start / { {1}}字段不应存在。在stop检查之后,o equals方法应该以{{1​​}}的标识/空检查结束,如果两者都是非空且不是同一个对象,那么它应该委托给(并返回)一个等于TestDate类的实现。

所以基本上案例2 是正确的方法,但我重新考虑在测试时启动和停止的存在。案例2声明也很容易被重构为一个简单的返回而没有if - 不确定我是否见过三元?作为if条件之前;)。课程的马,但我认为以下更容易阅读:

Test

testDate类上拥有return (testDate == test.testDate) || (testDate != null && testDate.equals(test.testDate)); / start字段意味着stop的实施正在泄漏到Test类中。如果您决定对TestDate进行一些重大更改(可能将值存储为本地化日期而不是为了参数),那么您可以在案例1下打破Test类,但案例2将在此情况下生存下去2更健壮。

另一个考虑因素是TestDate方法 - 案例1中Test / hashCode start字段上的问题实际上是双倍的,因为你应该真的是以一致的方式实施stop

随着系统变得越来越复杂,修复诸如此类问题的时间很快变得非常重要,而且更容易出错。