2010-01-08 15 views
5

Tengo una clase con los campos "deletionDate" y "experiationDate" que podrían no estar definidos, lo que significaría que el objeto está eliminado o no tiene una fecha de caducidad.Cómo expresar "nunca" con java.util.Date?

Mi primer acercamiento fue:

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

Tener el libro "Código limpio" en mente me recuerda a un mejor uso de nombres expresivos en lugar de comentarios. Así que mis soluciones actuales es:

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

pude usuario una clase envoltura alrededor de la fecha, pero eso complicaría APP mapeo.

¿Qué opina de eso? ¿Cómo expresarías "nunca"?

Respuesta

11

así, nunca, nunca, no es el 01/01/2999.

Me quedaría con su primera solución. una fecha nula significa que aún no ha sucedido.

tal vez se puede envolver con algo como:

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

+1. Nunca es nunca.^ – KB22

+1

También +1 para nunca es nunca, pero tenga en cuenta que el problema con el uso de null significa "establecer en nunca" es que significa que no tiene una forma de indicar " aún no establecido ". Es una pregunta de la aplicación si eso importa, pero es bastante fácil imaginar que el OP tarde descubra la necesidad de realizar un seguimiento de si el valor se ha establecido, lo que lleva a la necesidad de una segunda variable" boolean hasBeenSet "para cada , que sería asqueroso. – CPerkins

+0

Tenga en cuenta que * si * usted elige 'nulo' para esto, definitivamente debe documentar este significado. Como notas de @CPerkins, el significado exacto de' null' puede variar caso por caso. A veces 'nulo' es un error (es decir, nunca debe establecerse), a veces significa" desconocido ", a veces significa" aún no establecido ", ... –

-1

Simplemente elegiría una fecha de futuro lejano como el valor de la constante NUNCA. Luego, para verificar la eliminación/caducidad, simplemente compare contra NUNCA.

+1

Eso sería el año en el 8099. –

+0

El posible problema con eso es que si estás haciendo un rango u ordenando operaciones, entonces tener un valor grande pero real puede hacer algo inesperado. – GaryF

+0

¡Noooooo! ¡No use una fecha futura! ¿No has aprendido algo de Y2k o SpamAssassin? :( – Bombe

0

Deje el valor por defecto será tratado como "nunca"

3

Puede pensar en fecha nula como "no disponible" o "no aplicable". Si ese es el caso "NO FECHA" está bien para "nunca".

No subtipo Fecha solo para un requisito de estilo muy exquisito.

Una mejor opción es agregar semántica a su objeto modelo. Si dispone de un objeto cosa con una propiedad deletionDate que puede hacer:

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

y será más práctico y documentativa, tanto en la clase y en su código de cliente:

if(myThing.isNeverDeleted()) 
3

considero null apropiada . Indica claramente "no establecido".

Dependiendo de qué tan complicado desee obtener, sin embargo, podría tener un Enum y tener un estado como 'NeverExpires' como 'UserState' (o lo que sea que esté representando). Esto es probablemente preferible, pero podría ser inútilmente complejo, dependiendo de cuál sea su sistema.

-1

yo no usaría Date pero las marcas de tiempo, usando -1 por nunca y 0 de inmediato;

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

interpretación del atributo debe estar en un captador, como:

public boolean isExpired() { 

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

Supresión sigue el mismo patrón.

actualización sé que 0 y -1 son válidos marcas de tiempo, sino como de caducidad y borrado de archivos y otros recursos rara vez (nunca digas nunca :-)) ocurrirá en 1970 o antes, es una constante útil, en mi humilde opinión .

+0

-1 es una marca de tiempo válida (23: 59: 59.999 UTC el 31 de diciembre de 1969). – jarnbjo

Cuestiones relacionadas