java - 使用 jackson 映射时如何适本地覆盖 equals(Object o)

标签 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 的 startstop 参数的检查.

情况 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;
    }

或者

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

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

怀疑:

  • 情况 2 是否足以满足情况 1
  • 如果不是,有什么区别?
  • 如果是,哪一种是更好的做法?

寻找更多统计信息来说明为什么在代码复杂性和可重用性方面使用案例 2 而不是案例 1。

最佳答案

正确的方法是让 Test 关注自己的字段,因此它应该像您所做的那样根据 o 检查自身,但在我看来 start/stop 字段不应存在。在 o 检查之后,您的 Test equals 方法应该以对 testDate 进行身份/null 检查以及两者是否为非 null 并且不是同一对象结束那么它应该委托(delegate)给(并返回)TestDate 类上的 equals 实现。

所以基本上情况2是正确的方法,但我会重新考虑测试中开始和停止的存在。另外,Case 2 语句可以轻松地重构为简单的 return ,而无需 if - 不确定我是否见过三元?作为之前的 if 条件;)。类(class)的马,但我认为以下内容更容易阅读:

return (testDate == test.testDate) || (testDate != null && testDate.equals(test.testDate));

Test 类上拥有 start/stop 字段意味着 TestDate 的实现会泄漏到Test 类。如果您决定对 TestDate 进行一些重大更改(可能为了论证而将值存储为本地化日期),那么您会破坏 Case 1 下的 Test 类,但 Case 2 会幸免于难,因此案例 2 更加稳健。

另一个考虑因素是 hashCode 方法 - 上述案例 1 中的问题,在 Test 上使用 start/stop 字段 实际上加倍了,因为您确实应该以一致的方式实现 hashCode

随着系统变得越来越复杂,解决此类问题所需的时间很快就变得非常重要,并且更容易出错。

关于java - 使用 jackson 映射时如何适本地覆盖 equals(Object o),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37408596/

相关文章:

java.lang.IllegalStateException : Scanner closed

java - 有什么方法可以限制 JAXB 中对象图的编码深度吗?

java - 将 Java 接口(interface)转换为 Json 架构时出错

java - 使用 JacksonRepresentation 编写多行 CSV

java - 将 GET 参数添加到 Play Framework 2.2 响应

ruby-on-rails - Rails 5 允许 JSON 字段通过强参数不起作用

python - 在 int 值之后对 str 进行排序(Python、JSON)

java - 将 Jersey 输入流解析为 JacksonObject

java - 将字段序列化为 json

java - Tomcat 7.0.50 启动时属性的值部分中的无效字符 ':'