web-dev-qa-db-ja.com

Java.sql.DateとJava.util.Dateをorg.joda.time.LocalDateに変換する

私は古い(製品)コードのいくつかを注意深く細心の注意を払ってクリーンアップしようとしています。私がやろうとしていることの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;
}
_

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インスタンスは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日付を最も適切に処理するかです。何か不足していますか?私が求めていることを達成する簡単な方法はありますか?

16
ryvantage

データベースに2回アクセスするため、3項演算子を使用するコードを簡潔にすることはできません。次のようなメソッドでdateutilライブラリを書くことを検討してください:

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

IMOがこのコードをクリーンアップして、頻繁に使用される軽量の静的メソッドを犠牲にすることは、良い取引です。

また、Javaを使用しないことも検討してください。 JavaScriptでは||など、この問題はありません。 ScalaはNullable型をより明示的にサポートすることでこれを解決する優れた言語です。古いコードをクリーンアップしている限り、正しく実行することもできます。

25
djechlin

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();
        }
4
Runcorn