web-dev-qa-db-fra.com

Pourquoi la plupart des méthodes Java.util.Date sont-elles obsolètes?

Lorsque vous examinez le javadoc de la classe Java.util.Date, la plupart des méthodes sont obsolètes. Pourquoi était-ce fait?

45
Daniel Kaplan

Eh bien, pour deux raisons liées. La mise en œuvre du concept de dates et d’heures a été très médiocre et a été remplacée par la classe Calendar.

La classe Calendar, bien qu’elle soit une amélioration, laisse beaucoup à désirer également, alors pour un travail sérieux dans le domaine de la Date/Heure, tout le monde recommande Joda-Time . Java 8 apporte le nouveau package Java.time. * }, Inspiré de Joda-Time, défini par JSR-310 , et destiné à supplanter l'ancienne Date/Classes de calendrier.

Edit: En réponse à la question spécifique de savoir pourquoi la mise en œuvre est médiocre, les raisons sont multiples. Le JavaDoc le résume comme suit:

Malheureusement, l’API de ces fonctions n’était pas susceptible d’internationalisation.

Outre cette lacune générale (qui couvre des problèmes tels que l’absence de composante de fuseau horaire, ainsi que le formatage de la date qui est mieux géré dans DateFormat et l’incapacité d’avoir une représentation de calendrier non grégorien), il existe des problèmes spécifiques la classe Date, y compris le fait que l'année est présentée avec un décalage de 1900 par rapport à l'année de l'ère commune.

Calendar a ses propres problèmes, mais même dès JDK 1.1, il était évident que Java.util.Date n'allait pas le couper. Même si Calendar est incontestablement la pire API du JDK, il a fallu attendre la version 7 pour tenter de la résoudre.

44
Yishai
  • Date est mutable
  • Date ne prend pas en charge les fuseaux horaires

Ce dernier a conduit à le remplacer par Calendar. Et le premier, associé à la facilité d'utilisation, a conduit à leur remplacement par Joda-Time / JSR-310 ( Java.time. * Package )

16
Bozho

Ils sont obsolètes parce que Date a été écrit le plus rapidement possible à l’époque où ils voulaient précipiter le JDK vers la porte.

Il s'avère que les dates et les calendriers sont difficiles. Ils ont donc créé la classe Calendar, ce qui a beaucoup plus été pensé, afin de gérer les difficultés du travail avec les calendriers.

Ils ont déconseillé d'utiliser les méthodes Date et ont été délégués à Calendar car ils ne souhaitaient pas modifier le comportement des méthodes Date existantes et, éventuellement, supprimer les applications existantes.

10
Will Hartung

Voici une bonne réponse tout droit d’Oracle: http://www.Oracle.com/technetwork/articles/Java/jf14-date-time-2125367.html

Les développeurs Java ont depuis longtemps des problèmes avec la prise en charge inadéquate des cas d'utilisation de date et d'heure par les développeurs ordinaires.

Par exemple, les classes existantes (telles que Java.util.Date et SimpleDateFormatter) ne sont pas thread-safe, ce qui peut entraîner des problèmes de simultanéité pour les utilisateurs - ce que le développeur moyen ne s’attendrait pas à résoudre lors de l’écriture du code de traitement des dates.

Certaines classes de date et d’heure présentent également une conception d’API assez médiocre. Par exemple, les années dans Java.util.Date commencent à 1900, les mois à 1 et les jours à 0 - pas très intuitif.

... Java.util.Date représente un instant sur la timeline - un encapsuleur autour du nombre de millisecondes depuis l'époque UNIX - mais si vous appelez toString (), le résultat suggère qu'il a un fuseau horaire, ce qui provoque la confusion parmi les développeurs.

2
Daniel Kaplan

Je ne connais pas la raison officielle pour laquelle il est déconseillé, mais pour autant que je sache, GregorianCalendarand Joda-Time opérations de support sur dates, ce qui signifie que vous pouvez ajouter, par exemple, un jour à une date et avoir son mois et son année sont mis à jour en conséquence.

Par exemple, supposons que vous vouliez calculer le lendemain de la date actuelle et que nous sommes le 31 mai; avec Java.util.Date, vous avez simplement getDays() +1, qui renvoie 32, et vous devez gérer la certitude que le mois en cours ne dispose pas de 32 jours par vous-même; avec GregorianCalendarou Joda.time, l'ajout d'une journée au 31 mai donne un objet représentant le 1er juin, masquant ainsi la complexité de votre vue.

0
Raibaz