Я стараюсь тщательно и тщательно очищать некоторые из моих старых (производственных) кода. Одна вещь, которую я пытаюсь сделать, - это преобразовать все мои применения 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 (no 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? Я что-то упускаю? Есть ли более простой способ выполнить то, что я хочу?