Как выразить «никогда» с java.util.Date? - PullRequest
5 голосов
/ 08 января 2010

У меня есть класс с полями "deletionDate" и "ExperiationDate", которые могут быть неопределенными, что будет означать, что объект удален и не имеет срока годности.

Мой первый подход был:

private Date deletionDate = null; // null means not deleted

Имея в виду книгу «Чистый код», я не забываю лучше использовать выразительные имена вместо комментариев. Итак, мои текущие решения:

private static final Date NEVER = null;
private Date deletionDate = NEVER;

Я мог бы использовать класс-оболочку для Date, но это усложнило бы отображение JPA.

Что вы думаете об этом? Как бы вы выразили «никогда»?

Ответы [ 6 ]

11 голосов
/ 08 января 2010

ну никогда не бывает никогда, не 1/1/2999.

Я бы остался с твоим первым решением. Нулевая дата означает, что это еще не произошло.

может быть, вы можете обернуть это чем-то вроде:

boolean isNeverDeleted(){
    return deletionDate == null;
}
3 голосов
/ 08 января 2010

считаю null уместным. Это четко указывает «не установлено».

Однако, в зависимости от того, насколько сложным вы хотите стать, у вас может быть Enum и какое-то состояние, например «NeverExpires», в качестве «UserState» (или что бы вы ни представляли). Это, вероятно, предпочтительнее, но может быть бесполезно сложным, в зависимости от того, какая у вас система.

3 голосов
/ 08 января 2010

Вы можете считать нулевую дату «недоступной» или «не применимой». Если это так, то «НЕТ ДАТЫ» подходит для «никогда».

Не указывайте дату только для очень изысканного стиля.

Лучше всего добавить семантику к объекту модели. Если у вас есть объект Thing со свойством deletionDate, вы можете сделать:

class Thing
+ deletionDate
+ isNeverDeleted: boolean { return deletionDate == null; }

и это будет практично и документально, как в классе, так и в коде вашего клиента:

if(myThing.isNeverDeleted())
0 голосов
/ 08 января 2010

Я бы не использовал Date, но отметки времени, используя -1 для никогда и 0 для немедленного;

public static final long IMMEDIATE = 0;
public static final long NEVER = -1L;
private long expires = NEVER;

интерпретация атрибута должна быть в геттере, например:

public boolean isExpired() {

    return (NEVER == expires) ? false : (expires < System.currentTimeMillies());
}

Удаление происходит по той же схеме.

Обновление Я знаю, что 0 и -1 являются действительными временными метками, но поскольку истечение срока и удаление файлов и других ресурсов редко (никогда не говори никогда :-)) происходят в 1970 году или раньше, это полезно постоянная, имхо.

0 голосов
/ 08 января 2010

Пусть значение по умолчанию будет считаться "никогда"

0 голосов
/ 08 января 2010

Я бы просто выбрал дату в далеком будущем в качестве значения для константы НИКОГДА. Затем для проверки на удаление / истечение срока действия просто сравните с НИКОГДА.

...