18

我正在尝试仔细细致地清理我的一些旧(生产)代码。我想做的一件事是将我所有的java.util.DatetoLocalDateDateTime.

然而,今晚我在工作时注意到了一个很大的障碍。我有这个代码:

ResultSet results = stmt.executeQuery();

Date last = results.getDate("LAST_DELIVERY_DATE");
Date next = results.getDate("NEXT_DELIVERY_DATE");
boolean received;
if (last == null && next == null) {
    received = true; // order is not open
} else if (last == null) {
    received = false;
} else {
    received = true;
}

我转换lastnext

LocalDate last = new LocalDate(results.getDate("LAST_DELIVERY_DATE"));
LocalDate next = new LocalDate(results.getDate("NEXT_DELIVERY_DATE"));

和 Netbeans 强调if == null并说:

Unnecessary test for null - the expression is never null

这是有道理的,因为新LocalDate实例不会为空(不可以new Object())。

但是,在这种情况下以及在我的程序中的许多情况下,null日期传达了一些基本信息。在这种情况下,它显示订单 1) 是否打开(或未打开),2) 是否已收到(或未收到)。

所以,试图找到解决方法,我想我可以改用这段代码:

LocalDate last = results.getDate("LAST_DELIVERY_DATE") == null? null : new LocalDate(results.getDate("LAST_DELIVERY_DATE"));
LocalDate next = results.getDate("NEXT_DELIVERY_DATE") == null? null : new LocalDate(results.getDate("NEXT_DELIVERY_DATE"));

但是,这对我来说似乎很难看?另外,它两次调用“ResultSet#getDate()”函数,如果我错了,请纠正我……对数据库进行两次调用,对吧?所以,现在要将我的代码转换为 joda-time,我实际上是java.sql.Date从数据库中获取对象所需的时间增加了一倍......

LocalDate last = LocalDate.fromDateFields(results.getDate("LAST_DELIVERY_DATE"));
LocalDate next = LocalDate.fromDateFields(results.getDate("NEXT_DELIVERY_DATE"));

也不起作用,因为在获得值时会fromDateFields抛出 a 。NullPointerExceptionnull

所以,我的问题是:当你的程序需要有空日期和joda -time时,你如何最好地处理空日期?我错过了什么吗?有没有更简单的方法来完成我所追求的?

4

2 回答 2

30

您使用三元运算符的代码不能那么简洁,因为您两次访问数据库。考虑用这样的方法编写一个dateutil库:

    LocalDate convertToLocalDate(Date date) {
        if(date == null) return null;
        return new LocalDate(date);
    }

IMO 以经常使用的轻量级静态方法为代价来清理此代码是一个很好的交易。

还要考虑不使用 Java。例如,在 Javascript 中,您可以只使用||而不会出现此问题。Nullable我还听说 Scala 是一种很好的语言,它通过对类型的更明确的支持来解决这个问题。只要你在清理旧代码,还不如把它做对。

于 2013-12-23T03:17:50.027 回答
4

将 java.util.Date 转换为 org.joda.time.LocalDate

    public static LocalDate convertUtilDateToLocalDate(Date date) {
            if(date==null) return null;
            DateTime dt = new DateTime(date);
            return dt.toLocalDate();
        }
于 2013-12-23T04:05:25.437 回答