2013-12-23 13 views
10

Ich versuche sorgfältig und sorgfältig säubern einige meiner älteren (Produktion) Code. Eine Sache, die ich versuche, ist, alle meine Verwendungen von java.util.Date in LocalDate und DateTime umzuwandeln.Konvertieren von java.sql.Date & java.util.Date in org.joda.time.LocalDate

Allerdings bemerkte ich heute Nacht ein großes Hindernis, als ich arbeitete. Ich hatte diesen Code:

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; 
} 

I umgewandelt last und next zu:

LocalDate last = new LocalDate(results.getDate("LAST_DELIVERY_DATE")); 
LocalDate next = new LocalDate(results.getDate("NEXT_DELIVERY_DATE")); 

und Netbeans betonte die if == null und sagte:

Unnecessary test for null - the expression is never null 

Dies macht Sinn, weil eine neue LocalDate Instanz wird nicht null sein (nein new Object() kann sein).

ABER, in diesem Fall und in vielen Fällen in meinem Programm, ein null Datum kommuniziert einige wesentliche Informationen. In diesem Fall wird angezeigt, ob die Reihenfolge 1) offen ist (oder nicht), 2) empfangen wurde (oder nicht).

Also, versuchen, Wege, um es zu finden, dachte ich, ich stattdessen diesen Code verwenden:

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")); 

Aber dies scheint nur hässlich zu mir? Außerdem ruft es zweimal die Funktion "ResultSet # getDate()" auf, die .... korrigiert mich, wenn ich falsch liege ... macht zwei Aufrufe an die Datenbank, richtig ?. So, jetzt meinen Code joda-Zeit zu konvertieren ich im Wesentlichen die Zeit bin Verdoppelung es java.sql.Date Objekte aus der Datenbank zu erhalten nimmt ...

LocalDate last = LocalDate.fromDateFields(results.getDate("LAST_DELIVERY_DATE")); 
LocalDate next = LocalDate.fromDateFields(results.getDate("NEXT_DELIVERY_DATE")); 

nicht funktioniert, entweder, weil fromDateFields ein NullPointerException wirft, wenn es erhält einen null Wert.

Also, meine Frage ist: Wie behandeln Sie am besten null Daten, wenn Ihr Programm mit null Daten und Joda-Zeit braucht? Fehle ich etwas? Gibt es einen leichteren Weg, um das zu erreichen, wonach ich suche?

Antwort

18

Ihr Code mit dem ternären Operator kann nicht so knapp sein, weil Sie zwei Fahrten zur Datenbank machen. Betrachten wir eine dateutil Bibliothek mit einer Methode wie folgt zu schreiben:

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

IMO dieser Code machen auf Kosten eines aufzuräumen häufig verwendete leichte statische Methode ein gutes Geschäft ist.

Denken Sie auch daran, Java nicht zu verwenden. In Javascript könnten Sie einfach || verwenden und dieses Problem zum Beispiel nicht haben. Ich höre auch Scala ist eine gute Sprache, die dies mit expliziter Unterstützung für Nullable Arten löst. Solange Sie alten Code aufräumen, können Sie es auch richtig machen.

+0

Es ist ein Desktop 'Swing' Anwendung org.joda.time.LocalDate, so dass keine Java ist keine Option. – ryvantage

+0

@ryvantage Scala ist immer noch eine Option, da es auf der JVM läuft und bidirektional mit Java kompatibel ist. – djechlin

+0

Danke für den Vorschlag. – ryvantage

3

Um java.util.Date zu konvertieren

public static LocalDate convertUtilDateToLocalDate(Date date) { 
      if(date==null) return null; 
      DateTime dt = new DateTime(date); 
      return dt.toLocalDate(); 
     } 
Verwandte Themen