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类中声明的变量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;
}
OR
案例2: 只需使用Test类中创建的对象testDate
进行比较。如:
if (testDate != null ? !testDate.equals(test.testDate) : test.testDate != null) return false;
怀疑 :
在代码复杂性和可重用性方面寻找更多统计数据来解释为什么在案例1中使用案例2。
答案 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
。
随着系统变得越来越复杂,修复诸如此类问题的时间很快变得非常重要,而且更容易出错。