Java日期属性比较器契约冲突

Java日期属性比较器契约冲突,java,apache-spark,mapreduce,comparator,Java,Apache Spark,Mapreduce,Comparator,我有一个对象数组列表,我想按日期降序排序(最近的第一个)。类Foo有一个字符串参数“createdAt”,我用来定义compare-to方法重写 “createdAt”可能为null、空白或无效日期 @Override public int compareTo(Foo foo) { Date created = new Date(0); Date otherCreated = new Date(0); try { created = Utils.getF

我有一个对象数组列表,我想按日期降序排序(最近的第一个)。类Foo有一个字符串参数“createdAt”,我用来定义compare-to方法重写

“createdAt”可能为null、空白或无效日期

@Override
public int compareTo(Foo foo) {
    Date created = new Date(0);
    Date otherCreated = new Date(0);

    try {
        created = Utils.getFormattedDate(createdAt);

    } catch (Exception e) {
        e.printStackTrace();
    }
    try {
        otherCreated  = Utils.getFormattedDate(foo.createdAt);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return Long.compare(otherCreated.getTime(),created.getTime());

}
对于空检查,我定义了一个比较器

public static final Comparator fooComparator = new Comparator<Foo>() {
    @Override
    public int compare(Foo o1, Foo o2) {
        if (o1 ==null || o1.getCreatedAt() == null) {
            return (o2 ==null || o2.getCreatedAt() == null) ? 0 : 1;
        }
        if (o2==null || o2.getCreatedAt() == null) {
            return -1;
        }
        return o1.compareTo(o2);
    }
};

您是否选中“是”我尝试根据该选项编写测试用例,但它们都通过了。那么,如果compareTo方法中的某个try块中抛出异常,会发生什么情况?@sramalingam24该日期被视为新日期(0);我看不出
compareTo
方法实例化对象、生成字符串并最终从历元中提取
long
计数进行比较的意义,而不仅仅是调用内置的
Date::compareTo
。我猜您的字符串生成是为了验证数据,但是
比较到
实现不是进行数据验证的地方。
ArrayList <Foo> fooList = ....
Collections.sort(fooList, fooComparator);
@org.junit.Test
public void testCompare_Contract() {

    Foo t2 = new Foo();
    t2.setId(2L);
    t2.setCreatedAt(formatter.format(new Date(2018, 10, 28, 0, 0, 0).getTime()));
    t2.setText("Foo 2");

    Foo t3 = new Foo();
    t3.setId(3L);
    t3.setCreatedAt(null);
    t3.setText("Foo 3");

    Foo t4 = new Foo();
    t4.setId(4L);
    t4.setCreatedAt(formatter.format(new Date(2018, 10, 30, 0, 0, 0).getTime()));
    t4.setText("Foo 4");


    assertEquals(1, t3.compareTo(t2));
    assertEquals(-1, t2.compareTo(t3));

    assertEquals(1, t3.compareTo(t4));
    assertEquals(-1, t4.compareTo(t3));

    assertEquals(1, t2.compareTo(t4));
    assertEquals(-1, t4.compareTo(t2));

    assertEquals(0, t2.compareTo(t2));

}