¿Por qué fue & # 8220; nueva fecha (int año, int mes, int día) & # 8221; ¿obsoleto?

StackOverflow https://stackoverflow.com/questions/460423

  •  19-08-2019
  •  | 
  •  

Pregunta

Mi aplicación que heredé recientemente está LLENA de advertencias de desaprobación sobre el constructor:

Date d = new Date(int year, int month, int day)

¿Alguien sabe o puede señalar una razón por la cual algo tan simple como esto fue " reemplazado " con algo como esto:

Date d = null;
Calendar cal = GregorianCalendar.getInstance();
cal.set(1900 + year, month, day);
d = cal.getTime();

Ahora, obviamente, las advertencias de desaprobación no son un problema en sí mismas, pero ¿te imaginas los millones de LOC que estarían llorando en agonía si este constructor fuera eliminado alguna vez?

En mi breve juego de benchmarking, este último tarda aproximadamente un 50% más de tiempo en ejecutarse.

¿Fue útil?

Solución

Originalmente, Date tenía la intención de contener toda la lógica relativa a las fechas, pero los diseñadores de API finalmente se dieron cuenta de que la API que tenían hasta ahora era lamentablemente inadecuada y no se podía extender limpiamente para tratar correctamente problemas como como zonas horarias, locales, diferentes calendarios, horario de verano, etc.

Entonces crearon Calendar para tratar con toda esa complejidad, y relegaron Date a una marca de tiempo simple, despreciando toda su funcionalidad que se ocupaba de formatear, analizar y campos de fecha individuales .

Por cierto, internamente estos métodos tales como Date (int, int, int) constructor ahora llaman Calendar , entonces si ves una diferencia en la velocidad, entonces estás hacer algo mal al llamar a Calendar .

El resultado final: no es la API Calendar de Java la que es demasiado compleja, es el concepto humano de las fechas, y el único problema con Calendar es que no ofrece mucho en la forma de atajos a los usos más comunes.

Otros consejos

Las API de Java Date han sido criticadas durante mucho tiempo, ver por ejemplo este hilo .

Es posible que desee consultar Joda-Time o Apache Commons Lang para utilidades alternativas de fecha / hora.

La respuesta es portabilidad.

La clase Date no es muy flexible. Puede definir fechas, pero no con ninguna transformación a otros formatos de calendario. Entonces Sun decidió usar una jerarquía de clases adicional ( Calendar ) para hacerlo más flexible.

Sin embargo, no es muy útil.

Principalmente porque el java.util.Date original estaba hinchado y no era completamente consciente de la zona horaria y no era compatible con la internacionalización.

Sin embargo, Date todavía está en uso y muy bien, en Value Objects, o digamos como un tipo de datos. En la medida en que lo haga inmutable explícitamente, puede ir con facilidad. Tiendo a pensar que debe ser inmutable, para otro propósito tenemos que manipular Calendar. Donde se esperaba mucha manipulación, uno debería considerar algo como, Joda-Time.

[Edición editada

Simplemente no cree una instancia de la Fecha, en el último código. Es inútil. Puede lograr un mejor resultado para su punto de referencia.

Por supuesto, nadie usa ningún otro formato de calendario, pero la nueva API aumenta la cantidad de código para escribir para el caso común del 99%, por lo que es una gran bendición para los programadores de Java pagados por LoC.

Michael Borgwardt tenía la mejor respuesta, técnicamente. Pero, ¿por qué culpa a los humanos por la forma en que se presenta nuestro sistema solar?

Bien, se nos ocurrió la idea de segundos, minutos y horas.

Pero no es nuestra culpa que el día de la Tierra sea aproximado (dependiendo de si estamos hablando del verdadero día solar, el día solar medio o el día estelar, cada uno de los cuales varía periódicamente y al azar). No es nuestra culpa que el tiempo de la órbita de la Tierra alrededor del Sol sea aproximadamente 365 días, y no es nuestra culpa que la órbita de la luna alrededor de la Tierra sea aproximadamente 27.3 días (dependiendo de si estamos hablando de un mes sideral, sinódico, tropical, anómalo o dracónico).

¿No te alegra que Calendar no haya tenido en cuenta todos esos detalles? Entonces, nuestros errores de software podrían depender de la fase de la luna.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top