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

153

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

Je veux savoir des choses

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

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

Umesh Aawte
la source
7
Souhaitez-vous «continuer» à conduire votre 1955 Volkswagen Beetlemême si on vous offre Corvette Stingray, gratuitement? (0:
KMån
75
@KMan vous comparez une voiture européenne à une voiture américaine ?;)
ponzao
2
@Ponzao et 4autres: Gotcha! (0;
KMån
2
Faux? Parlons-nous ici de dépréciation mortelle ou vénielle?
FastAl
5
@Alexander pas de votes pour votre commentaire, donc +1 pour le vôtre aussi;) en tout cas, sachez que le nouveau code est 1000 mieux que l'ancien. La comparaison serait meilleure entre 1955 Volkswagen Beetleet 1956 Volkswagen Beetleavec des pneus neufs dont vous ne savez pas quand ils casseront!
Aleks

Réponses:

265

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

D'après la définition de obsolète :

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

La méthode est conservée dans l'API à des fins de compatibilité descendante pendant une période non spécifiée et peut être supprimée dans les versions futures. Autrement dit, non, ce n'est pas faux , mais il existe une meilleure façon de le faire, qui est plus robuste contre les changements d'API.

2. Et si je ne change aucune méthode et exécute mon 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 une structure de données interne change en faveur d'une nouvelle méthode meilleure, il pourrait y avoir un impact sur les performances, mais c'est assez improbable.


La dépréciation la plus amusante de l'API Java est imo, le FontMetrics.getMaxDecent. Raison de l'abandon: erreur d'orthographe.

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

aioobe
la source
5
La prochaine dépréciation la plus amusante de l'API Java serait setMultiClickThreshhold (int threshhold) et getMultiClickTreshhold () dans AbstractButton (Swing). Préparez-vous pour ces deux-là! ;)
JavaTechnical
3
Nous devons le faire avec HTTP REFERER. C'est
exaspérant
1
@DaveMcClelland, a fait 70 de 69: D;)
VdeX
28

Vous pouvez toujours utiliser du code obsolète sans que les performances soient modifiées, mais le but de la désapprobation d'une méthode / classe est de faire savoir aux utilisateurs qu'il existe désormais une meilleure façon de l'utiliser et que dans une prochaine version, le code obsolète sera probablement supprimé.

abyx
la source
1
Comment pouvez-vous être sûr que les performances ne changent pas? La dépréciation pourrait par exemple être due à un changement d'une structure de données interne, par exemple d'un HashSet à un TreeSet.
aioobe
@aioobe - À ma connaissance, l'OP a demandé si l'appel de code obsolète posait des problèmes de performances, ce qui n'est pas le cas étant donné qu'il ne modifie pas le code d'octet produit (avant 1.5 était en javadoc, maintenant l'annotation est en cours d'utilisation, mais toujours pas de changement de performance)
abyx
Lors du passage d'une version d'une bibliothèque à une autre, il n'y a aucune garantie que l'octet code d'une méthode dans la nouvelle version soit identique à l'octet code de la même méthode dans la version précédente.
aioobe
@aioobe - il y a une garantie que le simple fait de le rendre obsolète ne changera pas le code d'octet, ce que je pense que l'OP signifiait. Bien sûr, le code lui-même change, c'est pourquoi nous abandonnons le code.
abyx
Si vous continuez à utiliser la même version qu'avant, il n'y a pas de changement. Mais si vous utilisez une version plus récente de la bibliothèque et que l'API n'est pas obsolète, il POURRAIT y avoir une altération des performances, si l'implémentation sous-jacente est radicalement modifiée et que la nouvelle API en profite, tandis que l'ancienne API n'est pas aussi efficace comme elle l’était, par rapport à cette nouvelle structure.
gregturn
21

Terminologie

Extrait du glossaire officiel Sun:

obsolescence : fait référence à une classe, une interface, un constructeur, une méthode ou un champ qui n'est plus recommandé et qui peut cesser d'exister dans une version future.

Dans le guide comment et quand désapprouver:

Vous avez peut-être entendu le terme «humour d'autodérision» ou humour qui minimise l'importance de l'orateur. Une classe ou une méthode obsolète est comme ça. Ce n'est plus important. Il est si peu important, en fait, que vous ne devriez plus l'utiliser, car il a été remplacé et peut cesser d'exister à l'avenir.

L' @Deprecatedannotation est allée plus loin et met en garde contre le danger:

Un élément de programme annoté @Deprecatedest un élément que les programmeurs sont découragés d'utiliser, généralement parce qu'il est dangereux ou parce qu'il existe une meilleure alternative.

Références


Vrai ou faux?

La question de savoir s'il est bon ou mauvais d'utiliser des méthodes obsolètes devra être examinée sur une base individuelle. Voici TOUS les guillemets où le mot "obsolète" apparaît dans Effective Java 2nd Edition :

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

Point 66: Synchroniser l'accès aux données mutables partagées : les bibliothèques fournissent la Thread.stopméthode, mais cette méthode était obsolète depuis longtemps car elle est intrinsèquement dangereuse - son utilisation peut entraîner une corruption des données.

Élément 70: Sécurité des threads de document : la System.runFinalizersOnExitméthode est hostile aux threads et a été déconseillée.

Point 73: Évitez les groupes de threads : ils vous permettent d'appliquer certaines Threadprimitives à un tas de threads à la fois. Plusieurs de ces primitives ont été désapprouvées et les autres sont rarement utilisées. [...] les groupes de threads sont obsolètes.

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

Avec d'autres méthodes, vous devrez considérer les problèmes individuellement et comprendre POURQUOI ils ont été déconseillés, mais de manière générale, lorsque la décision de désapprouver est justifiée, il aura tendance à pencher vers le mal plutôt que vers le bien pour continuer à les utiliser.

Questions connexes

lubrifiants polygènes
la source
3
"Deprecated" vient du latin "de" + "precare" qui signifie "prier contre". Quand quelque chose est décrit comme obsolète, un Standard vous prie - vous supplie - de ne pas l'utiliser; c'est un avertissement qu'il pourrait être supprimé dans une future version de cette norme. Notez qu'une fonctionnalité obsolète doit être entièrement mise en œuvre dans toute implémentation de la version actuelle de cette norme. Votre mention de l'humour auto-dépréciant est cependant légèrement hors de propos; «auto-déprécier» dans ce sens est une corruption de «l'auto-dépréciation», qui a une dérivation et une signification différentes.
dajames le
17

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

En cherchant pourquoi un appel est obsolète, je me surprends souvent à apprendre des choses intéressantes sur Java / l'API / le Framework. Il y a souvent une bonne raison pour laquelle une méthode est obsolète et la compréhension de ces raisons conduit à des informations plus approfondies.

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

Peter Tillemans
la source
11

Cela ne crée certainement pas de problème de performance - obsolète signifie qu'à l'avenir, il est probable que la fonction ne fera plus partie de la bibliothèque, vous devriez donc éviter de l'utiliser dans un nouveau code et changer votre ancien code pour arrêter de l'utiliser, donc vous ne rencontrez pas de problèmes un jour lorsque vous mettez à niveau les jambes de force et constatez que la fonction n'est plus présente

Michael Mrozek
la source
1
À en juger par l'expérience, «obsolète» signifie en réalité «vous ne devriez plus l'utiliser, mais il sera disponible pour toujours et à jamais». Au moins pour l'API Java Standard, je ne suis au courant d'aucune méthode ou classe ayant été supprimée après avoir été obsolète.
Michael Borgwardt
1
@Michael Eh bien, dans la pratique, les API suppriment rarement les fonctions obsolètes car elles pourraient être obsolètes pendant dix ans avec les compilateurs affichant "AVERTISSEMENT: ARRÊTEZ D'UTILISER CE FAUT", et les gens retourneraient toujours le jour où ils l'ont finalement supprimé. Je pense que obsolète est censé signifier "un jour, nous voulons supprimer cela, alors arrêtez de l'utiliser", même si dans la pratique cela se produit rarement
Michael Mrozek
@Michael Mrozek: Pas d'accord avec la déclaration It certainly doesn't create a performance issue; c'est trop subjectif pour le dire.
KMån
1
@KMan Une fonction marquée comme obsolète ne la rend pas moins efficace qu'elle ne l'était avant d'être marquée - elle fonctionnera exactement comme avant
Michael Mrozek
@Michael Borgwardt: C'est ainsi que cela fonctionne dans la plupart des langues standardisées. Et, bien sûr, si un élément obsolète devait être supprimé de la norme, les implémentations populaires le conserveraient en tant qu'extension.
David Thornley
8

Ce n'est pas faux, ce n'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 utilisez la nouvelle méthode améliorée. Certains éléments obsolètes sont vraiment dangereux et doivent être évités. La nouvelle méthode peut donner de meilleures performances que la méthode obsolète, mais ce n'est pas toujours le cas.

Bozhidar Batsov
la source
8

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

Essayez de l'éviter

Jigar Joshi
la source
4
  1. Généralement non, il n'est pas absolument faux d'utiliser des deprecatedméthodes tant que vous avez un bon plan d'urgence pour éviter tout problème si / quand ces méthodes disparaissent de la bibliothèque que vous utilisez. Avec l'API Java elle-même, cela ne se produit jamais, mais avec à peu près tout le reste, cela signifie qu'elle va être supprimée. Si vous prévoyez spécifiquement de ne pas mettre à niveau ( bien que vous devriez probablement le faire à long terme ) les bibliothèques de support de votre logiciel, il n'y a aucun problème à utiliser les deprecatedméthodes.
  2. Non.
Esko
la source
3

Oui, c'est faux.

Les méthodes ou classes obsolètes seront supprimées dans les futures versions de Java et ne doivent pas être utilisées. Dans chaque cas, il devrait y avoir une alternative disponible. Utiliser ça.

Il existe quelques cas où vous devez utiliser une classe ou une méthode obsolète pour atteindre un objectif de projet. Dans ce cas, vous n'avez vraiment pas d'autre choix que de l'utiliser. Les futures versions de Java peuvent 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 répondre aux exigences d'un projet, et ce ne sera certainement pas la dernière.

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

Le processus de dépréciation 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 au plus vite.

Erick Robertson
la source
2

Ce n'est pas faux, mais certaines des méthodes obsolètes sont supprimées dans les futures versions du logiciel, vous risquez donc de vous retrouver avec du code qui ne fonctionne pas.

Petar Minchev
la source
Removed? Voir la définition stackoverflow.com/questions/2941900/…
KMån
1
@KMan - dans le lien que vous avez posté, il est écrit - "La méthode est conservée dans l'API pour une compatibilité descendante pendant une période non spécifiée, et peut être SUPPRIMÉE dans les versions futures." J'ai écrit la même chose - certaines des méthodes obsolètes sont peut-être supprimées dans un avenir proche ou lointain.
Petar Minchev
2

Est-il incorrect d'utiliser des méthodes ou des classes obsolètes en Java? "

Pas mal en tant que tel, mais cela peut vous éviter des problèmes. 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 obsolète?

Parce que c'est intrinsèquement dangereux. L'arrêt d'un thread le fait déverrouiller 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, d'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 il 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 que le dommage réel se soit produit, même des heures ou des jours dans le futur.


Et si ne changez aucune méthode et exécutez 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 en termes de performances. L'API standard est conçue pour respecter une certaine compatibilité descendante afin que les applications puissent être progressivement adaptées aux nouvelles versions de Java.

James P.
la source
2

Est-il incorrect d'utiliser des méthodes ou des classes obsolètes en Java? Ce n'est pas «faux», fonctionne toujours mais évitez-le autant que possible.

Supposons qu'une faille de sécurité soit associée à une méthode et que les développeurs déterminent qu'il s'agit d'une faille de conception. Ils peuvent donc décider de désapprouver 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 exécutez mon application avec les avertissements que j'ai, cela créera-t-il un problème de performance.

Si la dépréciation est due à un problème de performances, vous souffrirez d'un problème de performances, 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.

Chathuranga Chandrasekara
la source
2

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

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

C'est comme utiliser Windows 3.1 au lieu de Windows 7 si vous pensez que Windows 3.1 est obsolète. Vous pouvez toujours l'utiliser, mais il y a probablement de meilleures fonctionnalités dans une version future, plus les futures versions seront probablement prises en charge - 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 avoir de meilleures alternatives, et pourrait même ne pas être pris en charge.

Si vous utilisez du code obsolète, c'est généralement bien, tant que vous n'avez pas à passer à une API plus récente - le code obsolète peut ne pas y exister. Je suggère si vous voyez quelque chose qui utilise du code obsolète, de mettre à jour pour utiliser les nouvelles alternatives (ceci est généralement indiqué sur l'annotation ou dans un commentaire obsolète Javadoc).

Edit: Et comme l'a souligné Michael, 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), alors évidemment, il ne faut pas utiliser le code obsolète.

Jamiebarrow
la source
1
"Si vous utilisez un code obsolète, c'est bien, tant que vous n'avez pas besoin de passer à une API plus récente" - pas tout à fait. Regardez pourquoi Thread.stop () est obsolète, et vous verrez que ce n'est pas bien, dans n'importe quelle version de JRE.
Michael
Ok, je devrais plutôt dire "généralement" très bien (mettra à jour ce bit) :) Par conséquent, utilisez à vos risques et périls. Évidemment, si la raison de la désapprouver est de mettre fin à une faille dans sa fonctionnalité, il est logique de ne pas l'utiliser. En général, cependant, il est bon d'utiliser une méthode obsolète. Donc ja, tout dépend de la raison de la dépréciation. Vrai.
jamiebarrow
1

Bien sûr que non - puisque tout Java est en train de devenir @Deprecated :-) vous pouvez vous sentir libre de les utiliser aussi longtemps que dure Java. De toute façon, je ne remarquerai aucune différence, à moins que ce soit quelque chose de vraiment cassé. Signification - avoir à lire et ensuite décider.

Dans .Net cependant, quand quelque chose est déclaré [Obsolète], lisez-le immédiatement 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 avantageux d'être techno-conservateur de nos jours, mais vous devez d'abord faire votre corvée de lecture.

ZXX
la source
1

Je pense que la méthode obsolète signifie; il existe une autre méthode disponible, meilleure à tous égards que la méthode existante. Mieux vaut utiliser la bonne méthode que l'ancienne méthode existante. Pour des raisons de compatibilité descendante, les anciennes méthodes sont abandonnées.

DPM
la source