2012-06-03 8 views
21

Sé que esto puede ser una pregunta obvia, pero me gustaría encontrar en este código:¿Por qué crearías una instancia con -1 como argumento?

private Date lastActivity = new Date(-1); 

Y tengo curiosidad lo que esto hace - la Date class tiene seis constructores diferentes, y sólo uno puede tomar un solo argumento de long , así:

public Date(long date) 

cuales:

asigna un objeto Date y lo inicializa para representar a la especificada número de milisegundos desde la hora base estándar conocida como "la época ", es decir, el 1 de enero de 1970, 00:00:00 GMT.

Entonces, ¿es -1 solo un marcador de posición? Agradezco cualquier consejo o consejo.

Respuesta

5

Así es -1 simplemente un marcador de posición? Agradezco cualquier consejo o consejo.

Probablemente no en el sentido de que el término marcador de posición se utiliza normalmente. (Eso es algo que representa ... o tiene un lugar para ... otra cosa.)

Es más probable que sea un valor que represente una condición de frontera para el cálculo. En este caso particular, el nombre de la variable lastActivity parece implicar esto. Me imagino que esto es parte de algún algoritmo para determinar la última hora de "una actividad" ... y que el objeto Date(-1) se interpretará como "la actividad nunca ocurrió". También podrían haber usado null o una bandera para representar esto ... pero usar un objeto Date "funky" probablemente simplifica un poco la lógica del algoritmo.

Un "valor de centinela" es un buen término para esto ... pero el "valor de marcador" no es tan bueno, porque en realidad no marca nada.

(En cierto sentido, la elección de -1 es arbitraria. Podría ser cualquier valor ... siempre que no correspondiera con un punto de tiempo que pueda encontrar el algoritmo. Usar -1 es ideal si el tiempo los puntos siempre serán después de la época de UNIX ... 1 de enero de 1970. Pero si potencialmente tiene que lidiar con fechas históricas, entonces tal vez Long.MIN_VALUE sería mejor. De cualquier manera ... esto es probable que sea discutible en el contexto de su tarea.)

17

Uno típicamente haría esto para obtener una fecha "bien conocida", quizás para validación o comparaciones (todas las "Fechas reales" son mayores que esta), como un "objeto marcador" para indicar que la Fecha es realmente desconocida/ilegal/pendiente, pero no desea utilizar nulo por alguna razón, o tal vez para una prueba unitaria.

O.K., buscando los términos más adecuados para lo que llamé un "valor de marcador", obtengo el valor de centinela, el valor de bandera, el valor de viaje, el valor falso, el valor de señal o los datos ficticios. ver wikipedia article here

+0

¿Se puede hacer eso? Pensé que el objeto 'Fecha' arrojaría una excepción si intentaba establecerlo en un valor no válido. [por diseño], supongo. –

+0

Nunca he intentado con -1 pero a menudo he usado una nueva Fecha (0) para este propósito – user949300

+2

@Adel sí, es una fecha falsa, pero una fecha falsa "bien conocida". :-) En muchos ejemplos usa -1 para un conteo o índice para indicar "no encontrado". (por ejemplo, String.indexOf()). En ese ejemplo, -1 es una posición falsa bien conocida. – user949300

19

es January 1, 1970, 00:00:00 GMTmenos de un milisegundo (números negativos son fechas en la parte trasera del comienzo de la época)

+0

¡Muchísimas gracias! – Coffee

+0

Sí, pero ¿cree que es probable que la última actividad en realidad sucedió en ese momento? No, esto es casi seguro un objeto marcador. – user949300

4

Esto se llama sentinel value.El objetivo es generalmente indicar que los datos no están disponibles, que una serie de datos ha llegado a su fin, etc. Al usar un valor específico, obviamente no válido, se ahorra el esfuerzo de mantener un campo separado isValid o isFinished.

Las opiniones difieren sobre si esto es una buena práctica o no. Cuando la convención es muy conocida, como en el ASCII \0 que termina una cadena en C, generalmente se acepta. En otras circunstancias, a menudo existe la posibilidad de que pueda ampliar el rango de lo que se considera 'válido' en el futuro, y entonces estará en un aprieto cuando trate con datos heredados. También viola el principio de responsabilidad única: esa información puede representar dos piezas de información bastante diferentes, lo que perjudica la capacidad de mantenimiento porque el lector de código puede no ser consciente del potencial especial oculto, y el sistema de tipo no lo ayuda a descubrirlo .

+0

+1 para discutir los problemas con este código – sleske

Cuestiones relacionadas