Ist es falsch, veraltete Methoden oder Klassen in Java zu verwenden?

153

Ich verwende Eclipse, um eine Webanwendung zu entwickeln. Erst heute habe ich meine Struts-Version durch Ändern der JAR-Datei aktualisiert. Ich erhalte an einigen Stellen Warnungen, dass Methoden veraltet sind, aber der Code funktioniert einwandfrei.

Ich möchte einige Dinge wissen

  1. Ist es falsch, veraltete Methoden oder Klassen in Java zu verwenden?

  2. Was passiert, wenn ich keine Methode ändere und meine Anwendung mit Warnungen ausführe, die ich habe, wird dies zu Leistungsproblemen führen.

Umesh Aawte
quelle
7
Würden Sie weiterhin fahren, 1955 Volkswagen Beetleauch wenn Sie Corvette Stingraykostenlos angeboten werden? (0:
KMån
75
@KMan Sie vergleichen ein europäisches Auto mit einem amerikanischen Auto
?;
2
@ Ponzao und 4andere: Gotcha! (0;
KMån
2
Falsch? Sprechen wir hier von tödlicher oder nur von venialer Deprivation?
FastAl
5
@Alexander keine Stimmen für Ihren Kommentar, also +1 auch für Ihren;) auf jeden Fall schwer, dass der neue Code 1000 besser ist als der alte Code. Der Vergleich wäre besser zwischen 1955 Volkswagen Beetleund 1956 Volkswagen Beetlemit neuen Reifen, von denen Sie nicht wissen, wann sie kaputt gehen werden!
Aleks

Antworten:

265

1. Ist es falsch, veraltete Methoden oder Klassen in Java zu verwenden?

Aus der Definition von veraltet :

Ein mit @Deprecated kommentiertes Programmelement wird von Programmierern nicht verwendet, normalerweise weil es gefährlich ist oder weil es eine bessere Alternative gibt.

Die Methode wird aus Gründen der Abwärtskompatibilität für einen nicht festgelegten Zeitraum in der API gespeichert und kann in zukünftigen Versionen entfernt werden. Das heißt, nein, es ist nicht falsch , aber es gibt einen besseren Weg, der robuster gegen API-Änderungen ist.

2. Wenn ich keine Methode ändere und meine Anwendung mit Warnungen ausführe, führt dies zu Leistungsproblemen.

Höchstwahrscheinlich nein. Es wird weiterhin wie vor der Abschreibung funktionieren. Der Vertrag der API-Methode wird nicht geändert. Wenn sich einige interne Datenstrukturen zugunsten einer neuen, besseren Methode ändern, kann dies Auswirkungen auf die Leistung haben, dies ist jedoch ziemlich unwahrscheinlich.


Die lustigste Abwertung in der Java-API ist imo, die FontMetrics.getMaxDecent. Grund für die Ablehnung: Rechtschreibfehler.

Veraltet. Ab JDK Version 1.1.1, ersetzt durch getMaxDescent ().

aioobe
quelle
5
Die nächst lustigste Ablehnung in der Java-API wäre setMultiClickThreshhold (int Threshhold) und getMultiClickTreshhold () in AbstractButton (Swing). Mach dich bereit für diese beiden! ;)
JavaTechnical
3
Wir müssen dies mit HTTP REFERER tun. Es ist verrückt: en.wikipedia.org/wiki/HTTP_referer
kmiklas
1
@ DaveMcClelland, machte es 70 von 69: D;)
VdeX
28

Sie können weiterhin veralteten Code verwenden, ohne dass die Leistung geändert wird. Der Sinn einer veralteten Methode / Klasse besteht jedoch darin, den Benutzern mitzuteilen, dass es jetzt eine bessere Möglichkeit gibt, sie zu verwenden, und dass der veraltete Code in einer zukünftigen Version wahrscheinlich entfernt wird.

Abyx
quelle
1
Wie können Sie sicher sein, dass sich die Leistung nicht ändert? Der Entzug könnte beispielsweise auf eine Änderung einer internen Datenstruktur zurückzuführen sein, beispielsweise von einem HashSet zu einem TreeSet.
Aioobe
@aioobe - Nach meinem Verständnis hat das OP gefragt, ob das Aufrufen von veraltetem Code Leistungsprobleme aufweist, die es nicht angibt, dass es den produzierten Bytecode nicht ändert (bevor 1.5 in Javadoc war, wird jetzt die Annotation verwendet, aber immer noch keine Änderung der Leistung)
Abyx
Beim Wechsel von einer Version einer Bibliothek zu einer anderen kann nicht garantiert werden, dass der Bytecode einer Methode in der neuen Version mit dem Bytecode derselben Methode in der vorherigen Version identisch ist.
Aioobe
@aioobe - Es gibt eine Garantie dafür, dass durch einfaches Veralten der Bytecode nicht geändert wird, was meiner Meinung nach das OP bedeutete. Natürlich ändert sich der Code selbst, weshalb wir den Code ablehnen.
Abyx
Wenn Sie weiterhin dieselbe Version wie zuvor verwenden, gibt es keine Änderung. Wenn Sie jedoch eine neuere Version der Bibliothek verwenden und die API nicht veraltet ist, kann es zu Leistungsänderungen kommen, wenn die zugrunde liegende Implementierung drastisch geändert wird und die neue API davon profitiert, während die ältere API nicht so ist effizient wie früher, gegen diese neuere Struktur.
Gregturn
21

Terminologie

Aus dem offiziellen Sun-Glossar:

Veraltet : Bezieht sich auf eine Klasse, Schnittstelle, einen Konstruktor, eine Methode oder ein Feld, die nicht mehr empfohlen wird und in einer zukünftigen Version möglicherweise nicht mehr vorhanden ist.

Aus der Anleitung zum Wie und Wann:

Möglicherweise haben Sie den Begriff "selbstironischer Humor" oder "Humor" gehört, der die Bedeutung des Sprechers minimiert. Eine veraltete Klasse oder Methode ist so. Es ist nicht mehr wichtig. Es ist in der Tat so unwichtig, dass Sie es nicht mehr verwenden sollten, da es ersetzt wurde und möglicherweise in Zukunft nicht mehr existiert.

Die @DeprecatedAnmerkung ging noch einen Schritt weiter und warnte vor Gefahren:

Ein mit Anmerkungen versehenes @DeprecatedProgrammelement wird von Programmierern nicht verwendet, normalerweise weil es gefährlich ist oder weil es eine bessere Alternative gibt.

Verweise


Richtig oder falsch?

Die Frage, ob es richtig oder falsch ist, veraltete Methoden anzuwenden, muss individuell geprüft werden. Hier sind ALLE Anführungszeichen, in denen das Wort "veraltet" in Effective Java 2nd Edition vorkommt :

Punkt 7: Vermeiden Sie Finalisierer: Die einzigen Methoden, die behaupten, die Finalisierung zu garantieren, sind System.runFinalizersOnExitund ihr böser Zwilling Runtime.runFinalizersOnExit. Diese Methoden sind fatal fehlerhaft und veraltet.

Punkt 66: Synchronisieren des Zugriffs auf gemeinsam genutzte veränderbare Daten : Die Bibliotheken stellen die Thread.stopMethode bereit. Diese Methode wurde jedoch vor langer Zeit nicht mehr unterstützt, da sie von Natur aus unsicher ist. Ihre Verwendung kann zu einer Beschädigung der Daten führen.

Punkt 70: Sicherheit von Dokumentthreads : Die System.runFinalizersOnExitMethode ist threadfeindlich und veraltet.

Punkt 73: Vermeiden von Thread-Gruppen : Mit ihnen können Sie bestimmte ThreadGrundelemente gleichzeitig auf eine Reihe von Threads anwenden . Einige dieser Grundelemente sind veraltet, und der Rest wird selten verwendet. [...] Thread-Gruppen sind veraltet.

Zumindest bei allen oben genannten Methoden ist es eindeutig falsch, sie zu verwenden, zumindest laut Josh Bloch.

Bei anderen Methoden müssten Sie die Probleme einzeln betrachten und verstehen, WARUM sie veraltet sind. Wenn die Entscheidung zur Verwerfung jedoch gerechtfertigt ist, tendiert sie im Allgemeinen dazu, sie eher falsch als richtig zu verwenden.

Verwandte Fragen

Polygenschmierstoffe
quelle
3
"Veraltet" kommt aus dem Lateinischen "de" + "precare" und bedeutet "dagegen beten". Wenn etwas als veraltet beschrieben wird, betet ein Standard - bittet - Sie, es nicht zu benutzen; Es ist eine Warnung, dass es in einer zukünftigen Version dieses Standards entfernt werden kann. Beachten Sie, dass eine veraltete Funktion in jeder Implementierung der aktuellen Version dieses Standards vollständig implementiert werden muss. Ihre Erwähnung von selbstironischem Humor ist jedoch etwas falsch; "selbstironisch" in diesem Sinne ist eine Verfälschung von "selbstironisch", die eine andere Ableitung und Bedeutung hat.
Dajames
17

Abgesehen von all den hervorragenden Antworten, die ich oben gefunden habe, gibt es einen weiteren Grund, veraltete API-Aufrufe zu entfernen.

Wenn ich nachforsche, warum ein Anruf veraltet ist, lerne ich oft interessante Dinge über Java / die API / das Framework. Es gibt oft einen guten Grund, warum eine Methode veraltet ist, und das Verständnis dieser Gründe führt zu tieferen Einsichten.

Aus Sicht des Lernens / Wachsens ist es auch eine lohnende Anstrengung

Peter Tillemans
quelle
11

Es entsteht sicherlich kein Leistungsproblem - veraltet bedeutet, dass die Funktion in Zukunft wahrscheinlich nicht mehr Teil der Bibliothek sein wird. Sie sollten sie daher nicht in neuem Code verwenden und Ihren alten Code so ändern, dass sie nicht mehr verwendet wird Eines Tages treten keine Probleme auf, wenn Sie die Streben aktualisieren und feststellen, dass diese Funktion nicht mehr vorhanden ist

Michael Mrozek
quelle
1
Erfahrungsgemäß bedeutet "veraltet" wirklich "Sie sollten dies nicht mehr verwenden, aber es wird für immer und ewig verfügbar sein." Zumindest für die Java Standard API ist mir nicht bekannt, dass eine Methode oder Klasse jemals tatsächlich entfernt wurde, nachdem sie veraltet war.
Michael Borgwardt
1
@Michael Nun, in der Praxis entfernen APIs selten veraltete Funktionen, da sie zehn Jahre lang veraltet sein könnten, wenn Compiler "WARNUNG: STOPPEN SIE, DIESES SIE ZU FÜLLEN" ausgeben, und die Leute würden immer noch den Tag ausschalten, an dem sie es endgültig entfernt haben. Ich denke, veraltet soll bedeuten "eines Tages wollen wir das herausnehmen, also hören Sie bitte auf, es zu benutzen", auch wenn es in der Praxis selten tatsächlich vorkommt
Michael Mrozek
@ Michael Mrozek: Nicht einverstanden mit der Aussage It certainly doesn't create a performance issue; Es ist zu subjektiv, um das zu sagen.
KMån
1
@KMan Eine Funktion, die als veraltet markiert wird, macht sie nicht weniger effizient als vor dem Markieren - sie läuft genauso wie zuvor
Michael Mrozek
@ Michael Borgwardt: So funktioniert es in den meisten standardisierten Sprachen. Und wenn etwas Veraltetes aus dem Standard entfernt werden sollte, würden beliebte Implementierungen es natürlich als Erweiterung beibehalten.
David Thornley
8

Es ist nicht falsch, es wird einfach nicht empfohlen. Dies bedeutet im Allgemeinen, dass es an diesem Punkt eine bessere Möglichkeit gibt, Dinge zu tun, und Sie würden Gutes tun, wenn Sie die neue verbesserte Methode verwenden. Einige veraltete Sachen sind wirklich gefährlich und sollten ganz vermieden werden. Der neue Weg kann zu einer besseren Leistung führen als der veraltete, ist jedoch nicht immer der Fall.

Bozhidar Batsov
quelle
8

Sie haben vielleicht den Begriff "selbstironischer Humor" gehört. Das ist Humor, der Ihre Wichtigkeit minimiert. Eine veraltete Klasse oder Methode ist so. Es ist nicht mehr wichtig. Es ist in der Tat so unwichtig, dass es überhaupt nicht mehr verwendet werden sollte, da es wahrscheinlich in Zukunft nicht mehr existieren wird.

Versuche es zu vermeiden

Jigar Joshi
quelle
4
  1. Im Allgemeinen ist es nicht absolut falsch, deprecatedMethoden zu verwenden , solange Sie einen guten Notfallplan haben, um Probleme zu vermeiden, wenn diese Methoden aus der von Ihnen verwendeten Bibliothek verschwinden. Mit der Java-API selbst passiert dies nie, aber mit fast allem anderen bedeutet dies, dass es entfernt wird. Wenn Sie speziell planen, die unterstützenden Bibliotheken Ihrer Software nicht zu aktualisieren ( obwohl dies auf lange Sicht höchstwahrscheinlich der Fall sein sollte ), ist die Verwendung von deprecatedMethoden kein Problem .
  2. Nein.
Esko
quelle
3

Ja, das ist falsch.

Veraltete Methoden oder Klassen werden in zukünftigen Versionen von Java entfernt und sollten nicht verwendet werden. In jedem Fall sollte eine Alternative verfügbar sein. Verwende das.

Es gibt einige Fälle, in denen Sie eine veraltete Klasse oder Methode verwenden müssen, um ein Projektziel zu erreichen. In diesem Fall haben Sie wirklich keine andere Wahl, als es zu verwenden. Zukünftige Versionen von Java können diesen Code beschädigen, aber wenn dies erforderlich ist, müssen Sie damit leben. Es ist wahrscheinlich nicht das erste Mal, dass Sie etwas falsch machen mussten, um eine Projektanforderung zu erfüllen, und es wird sicherlich nicht das letzte Mal sein.

Wenn Sie auf eine neue Version von Java oder einer anderen Bibliothek aktualisieren, wird manchmal eine von Ihnen verwendete Methode oder Klasse veraltet. Veraltete Methoden werden nicht unterstützt, sollten jedoch keine unerwarteten Ergebnisse liefern. Das bedeutet jedoch nicht, dass dies nicht der Fall ist. Wechseln Sie Ihren Code so schnell wie möglich.

Der Verfallsprozess soll sicherstellen, dass die Autoren genügend Zeit haben, um ihren Code von einer alten API auf eine neue API umzustellen. Nutzen Sie diese Zeit. Ändern Sie Ihren Code so schnell wie möglich.

Erick Robertson
quelle
2

Es ist nicht falsch, aber einige der veralteten Methoden werden in zukünftigen Versionen der Software entfernt, sodass Sie möglicherweise keinen funktionierenden Code mehr haben.

Petar Minchev
quelle
Removed? Siehe Definition stackoverflow.com/questions/2941900/…
KMån
1
@KMan - in dem von Ihnen geposteten Link steht geschrieben: "Die Methode wird aus Gründen der Abwärtskompatibilität für einen nicht festgelegten Zeitraum in der API gespeichert und kann in zukünftigen Versionen ENTFERNT werden." Ich habe dasselbe geschrieben - einige der veralteten Methoden werden möglicherweise in naher oder ferner Zukunft entfernt.
Petar Minchev
2

Ist es falsch, veraltete Methoden oder Klassen in Java zu verwenden? "

Nicht falsch als solches, aber es kann Ihnen einige Probleme ersparen. In diesem Beispiel wird dringend davon abgeraten, eine veraltete Methode zu verwenden:

http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

Warum ist Thread.stop veraltet?

Weil es von Natur aus unsicher ist. Durch das Stoppen eines Threads werden alle gesperrten Monitore entsperrt. (Die Monitore werden entsperrt, wenn die ThreadDeath-Ausnahme den Stapel weitergibt.) Wenn sich eines der zuvor von diesen Monitoren geschützten Objekte in einem inkonsistenten Zustand befand, können andere Threads diese Objekte jetzt in einem inkonsistenten Zustand anzeigen. Solche Gegenstände sollen beschädigt sein. Wenn Threads an beschädigten Objekten arbeiten, kann dies zu willkürlichem Verhalten führen. Dieses Verhalten kann subtil und schwer zu erkennen sein oder es kann ausgeprägt sein. Im Gegensatz zu anderen nicht aktivierten Ausnahmen beendet ThreadDeath Threads stillschweigend. Daher hat der Benutzer keine Warnung, dass sein Programm beschädigt sein könnte. Die Korruption kann sich jederzeit nach dem tatsächlichen Schaden manifestieren, sogar Stunden oder Tage in der Zukunft.


Was passiert, wenn Sie keine Methode ändern und meine Anwendung mit Warnungen ausführen, die ich habe, wird dies zu Leistungsproblemen führen.

Es sollte keine Leistungsprobleme geben. Die Standard-API wurde so konzipiert, dass eine gewisse Abwärtskompatibilität berücksichtigt wird, sodass Anwendungen schrittweise an neuere Java-Versionen angepasst werden können.

James P.
quelle
2

Ist es falsch, veraltete Methoden oder Klassen in Java zu verwenden? Es ist nicht "falsch", funktioniert immer noch, aber vermeiden Sie es so weit wie möglich.

Angenommen, mit einer Methode ist eine Sicherheitslücke verbunden, und die Entwickler stellen fest, dass es sich um einen Konstruktionsfehler handelt. Daher können sie beschließen, die Methode zu verwerfen und den neuen Weg einzuführen.

Wenn Sie also immer noch die alte Methode verwenden, besteht eine Bedrohung. Seien Sie sich also des Grundes für die Ablehnung bewusst und prüfen Sie, ob sich dies auf Sie auswirkt.

Was passiert, wenn Sie keine Methode ändern und meine Anwendung mit Warnungen ausführen, die ich habe? Dies führt zu Leistungsproblemen.

Wenn die Abwertung auf ein Leistungsproblem zurückzuführen ist, leiden Sie unter einem Leistungsproblem. Andernfalls besteht kein Grund für ein solches Problem. Ich möchte noch einmal darauf hinweisen, sich des Grundes der Abwertung bewusst zu sein.

Chathuranga Chandrasekara
quelle
2

In Java ist es @Deprecated, in C # ist es [veraltet].

Ich glaube, ich bevorzuge die Terminologie von C #. Es bedeutet nur, dass es veraltet ist. Sie können es weiterhin verwenden, wenn Sie möchten, aber es gibt wahrscheinlich einen besseren Weg.

Es ist wie mit Windows 3.1 anstelle von Windows 7, wenn Sie glauben, dass Windows 3.1 veraltet ist. Sie können es weiterhin verwenden, aber es gibt wahrscheinlich bessere Funktionen in einer zukünftigen Version, und die zukünftigen Versionen werden wahrscheinlich unterstützt - die veraltete wird es nicht sein.

Gleiches gilt für Java's @Deprecated - Sie können die Methode weiterhin verwenden, aber auf eigenes Risiko - in Zukunft hat sie möglicherweise bessere Alternativen und wird möglicherweise nicht einmal unterstützt.

Wenn Sie veralteten Code verwenden, ist dies normalerweise in Ordnung, solange Sie nicht auf eine neuere API aktualisieren müssen. Der veraltete Code ist dort möglicherweise nicht vorhanden. Ich schlage vor, wenn Sie etwas sehen, das veralteten Code verwendet, zu aktualisieren, um die neueren Alternativen zu verwenden (dies wird normalerweise in der Anmerkung oder in einem veralteten Javadoc-Kommentar erwähnt).

Bearbeiten: Und wie Michael betont hat, sollte man den veralteten Code natürlich nicht verwenden, wenn der Grund für die Ablehnung auf einen Fehler in der Funktionalität zurückzuführen ist (oder weil die Funktionalität nicht einmal existieren sollte).

Jamiebarrow
quelle
1
"Wenn Sie veralteten Code verwenden, ist dies in Ordnung, solange Sie nicht auf eine neuere API aktualisieren müssen" - nicht ganz. Schauen Sie sich an, warum Thread.stop () veraltet ist, und Sie werden feststellen, dass es in keiner JRE-Version in Ordnung ist.
Michael
Ok, ich sollte lieber "normalerweise" gut sagen (wird dieses Bit aktualisieren) :) Verwenden Sie es daher auf eigenes Risiko. Wenn der Grund für die Ablehnung darin besteht, einen Fehler in der Funktionalität zu stoppen, ist es natürlich sinnvoll, ihn nicht zu verwenden. Im Allgemeinen ist es jedoch in Ordnung, eine veraltete Methode zu verwenden. Also ja, alles hängt vom Grund der Ablehnung ab. Wahr.
Jamie Barrow
1

Natürlich nicht - da das gesamte Java @Deprecated wird :-) Sie können sie jederzeit verwenden, solange Java verfügbar ist. Ich werde sowieso keinen Unterschied bemerken, es sei denn, es ist etwas wirklich kaputtes. Das heißt - muss darüber lesen und dann entscheiden.

Wenn jedoch in .Net etwas als [veraltet] deklariert ist, lesen Sie es sofort, auch wenn Sie es noch nie zuvor verwendet haben - Sie haben eine Wahrscheinlichkeit von 50%, dass es effizienter und / oder einfacher zu verwenden ist als das Ersetzen :-))

Im Allgemeinen kann es heutzutage sehr vorteilhaft sein, technokonservativ zu sein, aber Sie müssen zuerst Ihre Leseaufgabe erledigen.

ZXX
quelle
1

Ich denke, dass veraltete Methode bedeutet; Es gibt eine alternative Methode, die in allen Aspekten besser ist als die bestehende Methode. Verwenden Sie besser die gute Methode als die vorhandene alte Methode. Aus Gründen der Abwärtskompatibilität werden alte Methoden als veraltet belassen.

DPM
quelle