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 的 start 和 stop 参数的检查.
情况 1: 比较 Test 类中声明的变量 start
和 stop
并分配相应的 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/