ryv*_*age 16 java sql jodatime sql-date-functions
我正在努力仔细并仔细地清理我的一些旧的(生产)代码.我要做的一件事就是将我的所有用法转换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;
}
Run Code Online (Sandbox Code Playgroud)
我转换last和next到:
LocalDate last = new LocalDate(results.getDate("LAST_DELIVERY_DATE"));
LocalDate next = new LocalDate(results.getDate("NEXT_DELIVERY_DATE"));
Run Code Online (Sandbox Code Playgroud)
和Netbeans强调if == null并说:
Unnecessary test for null - the expression is never null
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为新LocalDate实例不会为null(不可以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"));
Run Code Online (Sandbox Code Playgroud)
但是,这对我来说似乎很难看?另外,它会两次调用"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"));
Run Code Online (Sandbox Code Playgroud)
也不起作用,因为当它获得一个值时会fromDateFields抛出一个.NullPointerExceptionnull
所以,我的问题是:你如何最好地处理无效的日期时,你的程序就必须有空日期和乔达时间?我错过了什么吗?有没有更简单的方法来完成我追求的目标?
dje*_*lin 25
使用三元运算符的代码不能精确地简化,因为您两次访问数据库.考虑dateutil使用如下方法编写库:
LocalDate convertToLocalDate(Date date) {
if(date == null) return null;
return new LocalDate(date);
}
Run Code Online (Sandbox Code Playgroud)
IMO以经常使用的轻量级静态方法为代价来清理这些代码是一个很好的交易.
还要考虑不使用Java.例如,在Javascript中你可以使用||而不是有这个问题.我还听说Scala是一种很好的语言,通过对Nullable类型的更明确的支持来解决这个问题.只要你正在清理旧代码,也可以做正确的事.