我正在尝试仔细地清理一些旧的(生产)代码。我想做的一件事是将java.util.Date
toLocalDate
和to的所有用法转换为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
引发一个。NullPointerException
null
因此,我的问题是:当程序需要具有空日期和Joda时间时,如何最好地处理空日期?我想念什么吗?有没有更简单的方法来实现我的目标?
使用三元运算符的代码不能那么精确,因为您需要两次访问数据库。考虑dateutil
使用如下方法编写库:
LocalDate convertToLocalDate(Date date) {
if(date == null) return null;
return new LocalDate(date);
}
IMO以牺牲经常使用的轻量级静态方法为代价来清理此代码是一项很好的交易。
还可以考虑不使用Java。例如,在Javascript中,您可以使用||
而不会出现此问题。我还听说Scala是一种很好的语言,可以通过更明确地支持Nullable
类型来解决此问题。只要您清理旧代码,就可以正确执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句