私は古い(製品)コードのいくつかを注意深く細心の注意を払ってクリーンアップしようとしています。私がやろうとしていることの1つは、_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
インスタンスはnullにならないので、これは理にかなっています(new Object()
はできません)。
[〜#〜] but [〜#〜]、この場合および多くの場合私のプログラム全体で、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()」関数を2回呼び出します。これは、間違っている場合は修正してください...データベースに対して2つの呼び出しを行いますよね?したがって、コードをjoda-timeに変換するために、データベースから_Java.sql.Date
_オブジェクトを取得するのに要する時間を基本的に2倍にしています...
_LocalDate last = LocalDate.fromDateFields(results.getDate("LAST_DELIVERY_DATE"));
LocalDate next = LocalDate.fromDateFields(results.getDate("NEXT_DELIVERY_DATE"));
_
fromDateFields
は、NullPointerException
値を取得するとnull
をスローするため、機能しません。
したがって、私の質問は、プログラムがhaving null日付とjoda-timeを必要とする場合、どのようにnull日付を最も適切に処理するかです。何か不足していますか?私が求めていることを達成する簡単な方法はありますか?
データベースに2回アクセスするため、3項演算子を使用するコードを簡潔にすることはできません。次のようなメソッドでdateutil
ライブラリを書くことを検討してください:
LocalDate convertToLocalDate(Date date) {
if(date == null) return null;
return new LocalDate(date);
}
IMOがこのコードをクリーンアップして、頻繁に使用される軽量の静的メソッドを犠牲にすることは、良い取引です。
また、Javaを使用しないことも検討してください。 JavaScriptでは||
など、この問題はありません。 ScalaはNullable
型をより明示的にサポートすることでこれを解決する優れた言語です。古いコードをクリーンアップしている限り、正しく実行することもできます。
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();
}