web-dev-qa-db-fra.com

Est-ce une erreur d'utiliser des méthodes ou des classes obsolètes en Java?

J'utilise Eclipse pour développer une application Web. Aujourd'hui, j'ai mis à jour la version de Struts en modifiant le fichier JAR. Je reçois des avertissements à certains endroits que les méthodes sont obsolètes, mais le code fonctionne bien.

Je veux savoir certaines choses

  1. Est-ce une erreur d'utiliser des méthodes ou des classes obsolètes en Java?

  2. Que se passe-t-il si je ne modifie aucune méthode et n'exécute pas l'application avec les avertissements que je crée? Cela créera-t-il un problème de performances?.

149
Umesh Aawte

1. Est-il erroné d'utiliser des méthodes ou des classes obsolètes en Java?

De la définition de deprecated :

Un élément de programme annoté @Deprecated est un élément que les programmeurs ne sont pas encouragés à utiliser, généralement parce que c'est dangereux ou parce qu'il existe une meilleure alternative.

La méthode est conservée dans l'API pour une compatibilité ascendante pendant une période indéterminée et peut être supprimée dans les versions ultérieures. C'est-à-dire que non, ce n'est pas faux, mais il existe une meilleure façon de le faire, qui est plus robuste contre les modifications d'API.

2. Et si je ne change aucune méthode et n'exécute pas l'application avec les avertissements que j'ai, cela créera-t-il un problème de performances?

Très probablement non. Il continuera à fonctionner comme avant la dépréciation. Le contrat de la méthode API ne changera pas. Si certaines structures de données internes changent en faveur d'une nouvelle méthode plus performante, cela pourrait avoir un impact sur les performances, mais c'est assez peu probable.


La dépréciation la plus amusante de la Java, est imo, la FontMetrics.getMaxDecent . Raison de la désapprobation: Erreur d’orthographe.

Obsolète. A partir de la version 1.1.1 du JDK, remplacé par getMaxDescent ().

261
aioobe

Vous pouvez toujours utiliser du code obsolète sans que les performances changent, mais le fait de déconseiller une méthode/classe est de faire savoir aux utilisateurs qu'il existe désormais un meilleur moyen de l'utiliser et que, dans une version ultérieure, le code obsolète sera probablement supprimé.

28
abyx

Terminologie

Du glossaire officiel de Sun:

deprecation : fait référence à une classe, une interface, un constructeur, une méthode ou un champ qui n'est plus recommandé et qui pourrait ne plus exister dans une version ultérieure.

Dans le guide "comment et quand désapprouver":

Vous avez peut-être entendu le terme "humour qui s'abaisse soi-même" ou un humour qui minimise l'importance du locuteur. Une classe ou une méthode obsolète est comme ça. Ce n'est plus important. En fait, il est si peu important que vous ne deviez plus l'utiliser, car il a été remplacé et risque de ne plus exister dans le futur.

Le @Deprecated L'annotation est allée plus loin et met en garde contre un danger:

Un élément de programme annoté @Deprecated est une option que les programmeurs ne sont pas encouragés à utiliser, généralement parce que c'est dangereux, ou parce qu'il existe une meilleure alternative.

Les références


Vrai ou faux?

La question de savoir s'il est bon ou mauvais d'utiliser des méthodes déconseillées devra être examinée individuellement. Voici [~ # ~] tous [~ # ~] les guillemets où le mot "obsolète" apparaît dans Effective Java 2e édition:

Point 7: Éviter les finaliseurs : Les seules méthodes qui prétendent garantir la finalisation sont System.runFinalizersOnExit et son jumeau diabolique Runtime.runFinalizersOnExit. Ces méthodes sont fatalement défectueuses et ont été déconseillées.

Article 66: Synchroniser l'accès aux données mutables partagées : Les bibliothèques fournissent le Thread.stop méthode, mais cette méthode est obsolète depuis longtemps car elle est intrinsèquement unsafe - son utilisation peut entraîner une corruption des données.

Rubrique 70: Sécurité du fil de document : Le System.runFinalizersOnExit Cette méthode est hostile aux threads et est obsolète.

Item 73: Eviter les groupes de threads : Ils vous permettent d'appliquer certaines primitives Thread à un groupe de threads à la fois. Plusieurs de ces primitives ont été déconseillées et les autres sont rarement utilisées. [...] les groupes de fils sont obsolètes.

Donc, au moins avec toutes les méthodes ci-dessus, il est clairement faux de les utiliser, du moins selon Josh Bloch.

Avec d’autres méthodes, vous devez examiner les problèmes individuellement et comprendre [~ # ~] pourquoi [~ # ~] ils sont déconseillés, mais en règle générale, lorsque la décision de déconseiller est justifiée, elle aura tendance à pencher davantage en faveur que le droit de continuer à les utiliser.

Questions connexes

21

Outre toutes les excellentes réponses ci-dessus, j'ai découvert qu'il y avait une autre raison de supprimer les appels d'API obsolètes.

Faites des recherches sur la raison pour laquelle un appel est obsolète. Je me trouve souvent en train d'apprendre des choses intéressantes sur Java/l'API/le Framework. Il y a souvent une bonne raison pour laquelle une méthode est déconseillée et sa compréhension conduit à une compréhension plus profonde.

Donc, du point de vue de l’apprentissage/de la croissance, c’est aussi un effort qui en vaut la peine

17
Peter Tillemans

Cela ne crée certainement pas de problème de performances - obsolète signifie qu'à l'avenir, il est probable que la fonction ne fasse plus partie de la bibliothèque, vous devez donc éviter de l'utiliser dans du nouveau code et de modifier votre ancien code pour cesser de l'utiliser, pour que vous n'ayez pas de problèmes un jour lorsque vous mettez à niveau struts et que vous trouviez que cette fonction n'est plus présente

11
Michael Mrozek

Vous avez peut-être entendu le terme "humour auto-dénigrement". C'est de l'humour qui minimise votre importance. Une classe ou une méthode obsolète est comme ça. Ce n'est plus important. En fait, il est si peu important qu'il ne soit plus utilisé du tout, car il cessera probablement d'exister à l'avenir.

Essayez de l'éviter

8
Jigar Joshi

Ce n'est pas faux, c'est tout simplement pas recommandé. Cela signifie généralement qu’à ce stade, il existe une meilleure façon de faire les choses et que vous feriez du bien si vous utilisiez la nouvelle méthode améliorée. Certaines choses obsolètes sont vraiment dangereuses et devraient être évitées. La nouvelle méthode peut offrir de meilleures performances que la méthode déconseillée, mais ce n'est pas toujours le cas.

7
Bozhidar Batsov
  1. Généralement non, ce n’est pas totalement faux d’utiliser des méthodes deprecated tant que vous avez un bon plan d’urgence pour éviter tout problème si/lorsque ces méthodes disparaissent de la bibliothèque que vous utilisez. Avec Java elle-même, cela ne se produit jamais, mais cela signifie qu’elle va être supprimée. Si vous prévoyez spécifiquement de ne pas mettre à niveau ( bien que vous probablement à long terme les bibliothèques de support de votre logiciel, l’utilisation de méthodes deprecated ne pose aucun problème.
  2. Non.
4
Esko

Oui, c'est faux.

Les méthodes ou classes obsolètes seront supprimées dans les versions futures de Java et ne doivent pas être utilisées. Dans chaque cas, une alternative doit être disponible. Utilisez-la.

Dans certains cas, vous devez utiliser une classe ou une méthode obsolète pour atteindre un objectif du projet. Dans ce cas, vous n'avez vraiment pas d'autre choix que de l'utiliser. Les versions futures de Java risquent de casser ce code, mais si c'est une exigence, vous devez vivre avec cela. Ce n'est probablement pas la première fois que vous devez faire quelque chose de mal pour rencontrer un projet exigence, et ce ne sera certainement pas la dernière.

Lorsque vous effectuez une mise à niveau vers une nouvelle version de Java ou une autre bibliothèque, une méthode ou une classe que vous utilisiez devient obsolète. Les méthodes obsolètes ne sont pas prises en charge, mais ne doivent pas produire de résultats inattendus. ne signifie pas qu’ils ne le feront pas, alors changez votre code dès que possible.

Le processus de désapprobation est là pour s'assurer que les auteurs ont suffisamment de temps pour changer leur code d'une ancienne API à une nouvelle API. Profitez de ce temps. Changez votre code plus rapidement.

3
Erick Robertson

Est-ce une erreur d'utiliser des méthodes ou des classes obsolètes en Java? "

Pas faux en tant que tel, mais cela peut vous éviter quelques ennuis. Voici un exemple où il est fortement déconseillé d'utiliser une méthode obsolète:

http://Java.Sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

Pourquoi Thread.stop est-il déconseillé?

Parce que c'est intrinsèquement dangereux. L'arrêt d'un thread provoque le déverrouillage de tous les moniteurs qu'il a verrouillés. (Les moniteurs sont déverrouillés lorsque l'exception ThreadDeath se propage dans la pile.) Si l'un des objets précédemment protégés par ces moniteurs était dans un état incohérent, les autres threads peuvent désormais afficher ces objets dans un état incohérent. On dit que ces objets sont endommagés. Lorsque les threads fonctionnent sur des objets endommagés, un comportement arbitraire peut en résulter. Ce comportement peut être subtil et difficile à détecter, ou peut être prononcé. Contrairement à d'autres exceptions non vérifiées, ThreadDeath tue les threads en silence; ainsi, l'utilisateur n'a aucun avertissement que son programme peut être corrompu. La corruption peut se manifester à tout moment après les dommages réels, même quelques heures ou plusieurs jours plus tard.


Et si ne changez aucune méthode et n'exécutez pas mon application avec les avertissements que j'ai, cela créera-t-il un problème de performances?.

Il ne devrait y avoir aucun problème de performance. L'API standard est conçue pour respecter une certaine compatibilité ascendante afin que les applications puissent être progressivement adaptées aux nouvelles versions de Java.

2
James P.

Est-ce une erreur d'utiliser des méthodes ou des classes obsolètes en Java? Ce n'est pas "faux", cela fonctionne toujours, mais évitez-le autant que possible.

Supposons qu'il existe une vulnérabilité de sécurité associée à une méthode et que les développeurs déterminent qu'il s'agit d'un défaut de conception. Ils peuvent donc décider de déconseiller la méthode et d’introduire la nouvelle méthode.

Donc, si vous utilisez toujours l'ancienne méthode, vous avez une menace. Soyez donc conscient de la raison de la dépréciation et vérifiez si cela vous affecte.

Et si ne changez aucune méthode et n'exécutez pas mon application avec les avertissements que j'ai, cela créera-t-il un problème de performances?

Si la dépréciation est due à un problème de performances, vous en souffrirez sinon, il n'y a aucune raison d'avoir un tel problème. Encore une fois tiens à souligner, soyez conscient de la raison de la dépréciation.

Ce n'est pas faux, mais certaines des méthodes déconseillées sont supprimées dans les futures versions du logiciel, de sorte que vous risquez de vous retrouver avec un code qui ne fonctionne pas.

2
Petar Minchev

Dans Java c'est @Deprecated, en C # c'est [Obsolete].

Je pense que je préfère la terminologie de C #. Cela signifie simplement que c'est obsolète. Vous pouvez toujours l'utiliser si vous le souhaitez, mais il existe probablement un meilleur moyen.

C'est comme si vous utilisiez Windows 3.1 au lieu de Windows 7 si vous croyez que Windows 3.1 est obsolète. Vous pouvez toujours l'utiliser, mais il y a probablement de meilleures fonctionnalités dans une future version, plus les futures versions seront probablement supportées - la version obsolète ne le sera pas.

Idem pour @Deprecated de Java - vous pouvez toujours utiliser la méthode, mais à vos risques et périls - à l'avenir, il pourrait offrir de meilleures alternatives et même ne pas être pris en charge.

Si vous utilisez du code obsolète, tout va bien, à condition que vous n'ayez pas à mettre à niveau vers une nouvelle API: le code obsolète peut ne pas exister là-bas. Je suggère que si vous voyez quelque chose utilisant du code obsolète, effectuez une mise à jour pour utiliser les alternatives les plus récentes (cela est généralement indiqué dans l'annotation ou dans un commentaire obsolète Javadoc).

Edit: Et comme Michael l'a fait remarquer, si la raison de la dépréciation est due à une faille dans la fonctionnalité (ou parce que la fonctionnalité ne devrait même pas exister), il est évident que vous ne devez pas utiliser le code obsolète.

1
jamiebarrow

Bien sûr que non - puisque l'ensemble Java devient @Deprecated :-), vous pouvez les utiliser aussi longtemps que Java dure. N'allez pas Notez quand même un diff, sauf s’il ya quelque chose de vraiment cassé.

Cependant, en .Net, quand quelque chose est déclaré [Obsolète], allez immédiatement le lire, même si vous ne l'avez jamais utilisé auparavant - vous avez environ 50% de chances qu'il soit plus efficace et/ou plus facile à utiliser que le remplacement :-))

Donc, en général, il peut être très bénéfique d’être techno-conservateur de nos jours, mais vous devez faire votre corvée de lecture d’abord.

1
ZXX

Je pense que cette méthode déconseillée signifie; il existe une méthode alternative = ive disponible qui est meilleure à tous égards que la méthode existante. Mieux vaut utiliser la bonne méthode que l'ancienne méthode. Pour la compatibilité ascendante, les anciennes méthodes sont laissées comme obsolètes.

1
DPM