2010-01-08 6 views
5

J'ai une classe avec les champs "deletionDate" et "experiationDate" qui pourraient tous deux être indéfinis, ce qui signifierait que l'objet est supprimé et n'a pas de date d'expiration.Comment exprimer "jamais" avec java.util.Date?

Ma première approche était:

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

Avoir le livre « code propre » à l'esprit, je me souviens de mieux utiliser les noms d'expression au lieu des commentaires. Donc, mes solutions actuelles sont:

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

Je pourrais utiliser une classe wrapper autour de Date, mais cela compliquerait le mappage JPA.

Qu'en pensez-vous? Comment voulez-vous exprimer "jamais"?

Répondre

11

bien n'est jamais, pas le 1/1/2999.

Je resterais avec votre 1ère solution. Une date nulle signifie que cela ne s'est pas encore produit.

peut-être vous pouvez l'envelopper avec quelque chose comme:

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

+1 Jamais n'est jamais.^ – KB22

+1

Aussi +1 pour jamais n'est jamais, mais notez que le problème avec l'utilisation de null pour signifier "mettre à jamais" est que cela signifie que vous n'avez pas alors un moyen d'indiquer " C'est une question d'application si cela compte, mais il est assez facile d'imaginer que l'OP découvre plus tard qu'il est nécessaire de garder une trace si la valeur a été définie, conduisant à avoir besoin d'une seconde variable "boolean hasBeenSet" pour chaque – CPerkins

+0

Notez que * si * vous choisissez 'null' pour cela, vous devriez certainement documenter ce sens.Comme @CPerkins le remarque, la signification exacte de 'null' peut varier au cas par cas. Parfois 'null' est une erreur (ie ne doit jamais être défini), parfois cela signifie" inconnu ", parfois cela signifie" pas encore défini ", ... –

-1

Je choisirais simplement une date de futur lointain comme valeur pour la constante JAMAIS. Ensuite, pour vérifier la suppression/expiration, il suffit de comparer contre JAMAIS.

+1

Ce serait l'année dans le 8099. –

+0

Le problème possible avec cela est que si vous faites toute la gamme ou les opérations de commande alors avoir une grande mais réelle valeur peut faire quelque chose d'inattendu. – GaryF

+0

Noooooo! N'utilisez pas de date future! N'avez-vous rien appris de Y2k ou de SpamAssassin? :( – Bombe

0

Laissez la valeur par défaut être traité comme « jamais »

3

Vous pouvez penser à la date nulle comme « non disponible » ou « non applicable ». Si c'est le cas "AUCUNE DATE" ne convient pour "jamais".

Ne pas sous-type Date uniquement pour une exigence de style très exquis.

Une meilleure option consiste à ajouter de la sémantique à votre objet de modèle. Si votre avez un objet chose avec une propriété deletionDate que vous pouvez faire:

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

et il sera pratique et documentative, aussi bien dans la classe et dans votre code client:

if(myThing.isNeverDeleted()) 
3

Je considère null approprié . Il indique clairement "non défini". En fonction de la complexité que vous souhaitez obtenir, cependant, vous pourriez avoir un Enum et avoir un état comme 'NeverExpires' comme 'UserState' (ou quoi que ce soit que vous représentez). Ceci est probablement préférable, mais pourrait être inutilement complexe, en fonction de ce que votre système.

-1

Je n'utiliserais pas Date mais les horodatages, en utilisant -1 pour jamais et 0 pour immédiatement;

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

interprétation de l'attribut doit être dans un getter, comme:

public boolean isExpired() { 

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

Cette suppression est le même schéma.

Mise à jour Je sais que 0 et -1 sont valides horodatages, mais que l'expiration et la suppression de fichiers et d'autres ressources rarement (jamais dire jamais :-)) se produire en 1970 ou avant, il est une constante utile, IMHO .

+0

-1 est un horodatage valide (23: 59: 59.999 UTC le 31 décembre 1969). – jarnbjo

Questions connexes