2010-01-08 9 views
5

Ich habe eine Klasse mit den Feldern "DeletionDate" und "ExperiationDate", die beide undefiniert sein könnten, was bedeuten würde, dass das Objekt gelöscht wurde oder ein Ablaufdatum hat.Wie man "nie" mit java.util.Date ausdrückt?

Mein erster Ansatz war:

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

das Buch „Clean Code“ im Auge Nachdem ich erinnere mich besser zu expressiven Namen statt Kommentare zu verwenden. Also meine aktuellen Lösungen ist:

Ich könnte eine Wrapper-Klasse um Date, aber das würde JPA Mapping komplizieren.

Was halten Sie davon? Wie würdest du "nie" ausdrücken?

Antwort

11

gut „nie“ ist, niemals nie nicht die 2999.01.01 behandelt werden.

Ich würde mit Ihrer ersten Lösung bleiben. Ein Nulldatum bedeutet, dass es noch nicht geschehen ist.

vielleicht können Sie es mit so etwas wie wickeln:

boolean isNeverDeleted(){ 
    return deletionDate == null; 
} 
+1

+1. Nie ist nie.^ – KB22

+1

Auch +1 für nie ist nie, aber beachten Sie, dass das Problem mit der Verwendung von Null zu "nie" bedeutet, dass es bedeutet, dass Sie dann nicht eine Möglichkeit haben, anzugeben " noch nicht gesetzt ". Es ist eine Anwendungsfrage, ob das wichtig ist, aber es ist ziemlich einfach, sich vorzustellen, dass der OP später feststellen muss, ob der Wert gesetzt wurde, was dazu führt, dass eine zweite" boolesche hasBeenSet "Variable benötigt wird Das wäre icky. – CPerkins

+0

Beachten Sie, dass * wenn * Sie für diese Option "null" wählen, sollten Sie diese Bedeutung unbedingt dokumentieren. Wie @CPerkins feststellt, kann die genaue Bedeutung von "null" von Fall zu Fall variieren. Manchmal ist 'null' ein Fehler (dh es darf nie gesetzt werden), manchmal bedeutet es" unbekannt ", manchmal bedeutet es" noch nicht gesetzt ", ... –

-1

Ich würde einfach ein weit in der Zukunft als Datum für die Konstante NIE wählen. Um dann nach Löschung/Ablauf zu suchen, vergleichen Sie einfach gegen NIE.

+1

Das wäre Jahr in der 8099. –

+0

Das mögliche Problem damit ist, wenn Sie einen Bereich oder Bestellvorgänge tun, dann einen großen aber realen Wert haben kann etwas Unerwartetes tun. – GaryF

+0

Noooooo! Verwenden Sie kein zukünftiges Datum! Hast du nichts von Y2k oder SpamAssassin gelernt? :( – Bombe

0

der Standardwert Lassen Sie als

3

Sie über null Datum denken können als „nicht verfügbar“ oder „nicht anwendbar“. Wenn das der Fall ist, ist "NO DATE" in Ordnung für "nie".

Do not Untertyp Date nur für eine sehr exquisite Stil Anforderung.

Eine bessere Option ist das Hinzufügen von Semantik zu Ihrem Modellobjekt. Wenn Ihr eine Sache Objekt mit einem deletionDate Eigenschaft haben, können Sie tun:

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

und wird es praktisch sein, und dokumentarische, sowohl in der Klasse und in der Client-Code:

if(myThing.isNeverDeleted()) 
3

Ich halte null angemessen . Es zeigt deutlich "nicht gesetzt" an.

Je nachdem, wie kompliziert Sie erhalten möchten, könnten Sie jedoch eine Enum haben und einen Zustand wie 'NeverExpires' als 'UserState' (oder was auch immer Sie repräsentieren) haben. Dies ist wahrscheinlich vorzuziehen, könnte aber nutzlos komplex sein, abhängig von Ihrem System.

-1

Ich würde nicht verwenden Date aber Zeitstempel, mit -1 für nie und 0 für sofort;

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

Interpretation des Attributs sollte in einem Getter sein, wie:

public boolean isExpired() { 

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

Deletion folgt das gleiche Muster.

Update Ich weiß, dass 0 und -1 gültige Zeitstempel sind, aber da Ablauf und Löschen von Dateien und anderen Ressourcen selten (nie sagen nie :-)) passieren 1970 oder davor, ist es eine nützliche Konstante, imho .

+0

-1 ist ein gültiger Zeitstempel (23: 59: 59.999 UTC am 31. Dezember 1969). – jarnbjo

Verwandte Themen