我正在尝试仔细、细致地清理我的一些旧(生产)代码。我想做的一件事是将我对 java.util.Date
的所有用法转换为 LocalDate
和 DateTime
。
但是,今晚我在工作时注意到了一个很大的障碍。我有这段代码:
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;
}
我将 last
和 next
转换为:
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
在获取 null
值时抛出 NullPointerException
。
所以,我的问题是:当您的程序需要具有空日期和 joda-time 时,您如何最好地处理空日期?我错过了什么吗?有没有更简单的方法来完成我所追求的目标?
最佳答案
您使用三元运算符的代码不能那么简洁正是因为您对数据库进行了两次访问。考虑使用如下方法编写一个 dateutil
库:
LocalDate convertToLocalDate(Date date) {
if(date == null) return null;
return new LocalDate(date);
}
IMO 以牺牲经常使用的轻量级静态方法为代价清理此代码是一个很好的交易。
也可以考虑不使用 Java。例如,在 Javascript 中,您可以只使用 ||
而不会出现这个问题。我还听说 Scala 是一种很好的语言,它通过更明确地支持 Nullable
类型来解决这个问题。只要您正在清理旧代码,不妨正确地进行清理。
关于java - 将 java.sql.Date 和 java.util.Date 转换为 org.joda.time.LocalDate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20736449/