È sbagliato usare metodi o classi obsoleti in Java?


153

Sto usando eclipse per sviluppare un'applicazione web. Proprio oggi ho aggiornato la mia versione di struts cambiando il file JAR. Ricevo avvisi in alcuni punti che i metodi sono obsoleti, ma il codice funziona correttamente.

Voglio sapere alcune cose

  1. È sbagliato usare metodi o classi obsoleti in Java?

  2. Che cosa succede se non cambio alcun metodo ed eseguo la mia applicazione con avvisi che ho, creerà qualsiasi problema di prestazioni.


7
Continueresti a guidare la tua 1955 Volkswagen Beetleanche se ti venisse offerto Corvette Stingraygratuitamente? (0:
KM

75
@KMan stai paragonando un'auto europea a un'auto americana ?;)
ponzao

2
@Ponzao e 4altri: Gotcha! (0;
KMån

2
Sbagliato? Stiamo parlando di deprivazione mortale o solo veniale qui?
FastAl

5
@Alexander nessun voto per il tuo commento, quindi +1 anche per il tuo;) in ogni caso, è difficile che il nuovo codice sia 1000 migliore del vecchio codice. Il confronto sarebbe migliore tra 1955 Volkswagen Beetlee 1956 Volkswagen Beetlecon le nuove gomme che non sai quando si romperanno!
Aleks,

Risposte:


265

1. È sbagliato usare metodi o classi obsoleti in Java?

Dalla definizione di deprecato :

Un elemento di programma annotato @Deprecated è uno che i programmatori sono scoraggiati dall'utilizzare, in genere perché è pericoloso o perché esiste un'alternativa migliore.

Il metodo è conservato nell'API per la compatibilità con le versioni precedenti per un periodo di tempo non specificato e potrebbe essere rimosso nelle versioni future. Cioè, no, non è sbagliato , ma c'è un modo migliore per farlo, che è più robusto contro le modifiche API.

2. Che cosa succede se non cambio alcun metodo ed eseguo la mia applicazione con avvisi che ho, creerà qualsiasi problema di prestazioni.

Molto probabilmente no. Continuerà a funzionare come prima dell'ammortamento. Il contratto del metodo API non cambierà. Se alcune strutture di dati interne cambiano a favore di un nuovo metodo migliore, ci potrebbe essere un impatto sulle prestazioni, ma è abbastanza improbabile.


La deprecazione più divertente nell'API Java è imo, il FontMetrics.getMaxDecent. Motivo della deprecazione: errore di ortografia.

Deprecato. A partire dalla versione 1.1.1 di JDK, sostituita da getMaxDescent ().


5
La prossima deprecazione più divertente nell'API Java sarebbe setMultiClickThreshhold (int threshhold) e getMultiClickTreshhold () in AbstractButton (Swing). Preparati per quei due! ;)
JavaTechnical

3
Dobbiamo farlo con HTTP REFERER. È esasperante: en.wikipedia.org/wiki/HTTP_referer
kmiklas

1
@DaveMcClelland, fatto 70 da 69: D;)
VdeX

28

È ancora possibile utilizzare il codice deprecato senza che le prestazioni vengano modificate, ma il punto principale di deprecare un metodo / classe è far sapere agli utenti che esiste ora un modo migliore di utilizzarlo e che in una versione futura è probabile che il codice deprecato venga rimosso.


1
Come puoi essere sicuro che sia senza cambiamenti nelle prestazioni? La deprivazione potrebbe ad esempio essere dovuta a una modifica di una struttura di dati interna, ad esempio da un HashSet a un TreeSet.
aioobe,

@aioobe - Per quanto ne so, l'OP ha chiesto se la chiamata del codice deprecato ha problemi di prestazioni, che non ha dato che non cambia il codice byte prodotto (prima della 1.5 era in javadoc, ora l'annotazione è in uso, ma ancora nessuna modifica alle prestazioni)
abyx

Quando si passa da una versione di una libreria a un'altra, non è garantito che il codice byte di un metodo nella nuova versione sia identico al codice byte dello stesso metodo nella versione precedente.
aioobe,

@aioobe - c'è la garanzia che semplicemente renderlo obsoleto non cambierà il codice byte, che è ciò che penso significhi l'OP. Naturalmente il codice stesso cambia, motivo per cui depreciamo il codice.
abyx,

Se continui a utilizzare la stessa versione di prima, non ci sono cambiamenti. Ma se usi una versione più recente della libreria e non hanno deprecato l'API, potrebbe esserci un'alterazione delle prestazioni, se l'implementazione sottostante viene drasticamente modificata e la nuova API ne approfitta, mentre l'API precedente non è come efficiente come una volta, contro questa nuova struttura.
gregturn,

21

Terminologia

Dal glossario ufficiale Sun:

deprecazione : si riferisce a una classe, un'interfaccia, un costruttore, un metodo o un campo che non è più raccomandato e che potrebbe smettere di esistere in una versione futura.

Dalla guida su come e quando deprecare:

Potresti aver sentito il termine "umorismo autoironico" o umorismo che minimizza l'importanza di chi parla. Una classe o un metodo deprecato è così. Non è più importante È così poco importante, infatti, che non dovresti più usarlo, poiché è stato sostituito e potrebbe smettere di esistere in futuro.

L' @Deprecatedannotazione ha fatto un ulteriore passo avanti e avvisa del pericolo:

Un elemento di programma annotato @Deprecatedè uno che i programmatori sono scoraggiati dall'utilizzare, in genere perché è pericoloso o perché esiste un'alternativa migliore.

Riferimenti


Giusto o sbagliato?

La questione se sia giusto o sbagliato usare metodi deprecati dovrà essere esaminata su base individuale. Ecco TUTTE le citazioni in cui la parola "obsoleto" appare in Effective Java 2nd Edition :

Articolo 7: Evita i finalizzatori : gli unici metodi che pretendono di garantire la finalizzazione sono System.runFinalizersOnExite il suo gemello malvagio Runtime.runFinalizersOnExit. Questi metodi sono fatalmente imperfetti e sono stati deprecati.

Articolo 66: sincronizzare l'accesso ai dati mutabili condivisi : le librerie forniscono il Thread.stopmetodo, ma questo metodo è stato deprecato molto tempo fa perché intrinsecamente non sicuro - il suo uso può causare il danneggiamento dei dati.

Articolo 70: Sicurezza del thread di documenti : il System.runFinalizersOnExitmetodo è thread-ostile ed è stato deprecato.

Articolo 73: Evita gruppi di thread : ti consentono di applicare determinati Threadprimitivi a un gruppo di thread contemporaneamente. Molti di questi primitivi sono stati deprecati e il resto è usato raramente. [...] i gruppi di thread sono obsoleti.

Quindi, almeno con tutti i metodi di cui sopra, è chiaramente sbagliato usarli, almeno secondo Josh Bloch.

Con altri metodi, dovresti considerare i problemi individualmente e capire PERCHÉ sono stati deprecati, ma in generale, quando la decisione di deprecare è giustificata, tenderà a inclinarsi verso l'errato che il diritto per continuare a usarli.

Domande correlate


3
"Deprecato" deriva dal latino "de" + "precare" che significa "pregare contro". Quando qualcosa viene descritto come deprecato, uno standard prega - implorando - di non usarlo; è un avvertimento che potrebbe essere rimosso in una versione futura di tale standard. Si noti che una funzionalità obsoleta deve essere implementata completamente in qualsiasi implementazione della versione corrente di quello standard. Tuttavia, la tua menzione di umorismo auto-deprecante è leggermente fuori dal comune; "auto-deprezzamento" in questo senso è una corruzione dell '"auto-deprezzamento", che ha una diversa derivazione e significato.
daames

17

A parte tutte le eccellenti risposte di cui sopra, ho scoperto che esiste un altro motivo per rimuovere le chiamate API deprecate.

Cercando perché una chiamata è deprecata, mi ritrovo spesso a imparare cose interessanti su Java / API / Framework. C'è spesso una buona ragione per cui un metodo viene deprecato e la comprensione di queste ragioni porta a intuizioni più profonde.

Quindi, dal punto di vista dell'apprendimento / crescita, è anche uno sforzo utile


11

Certamente non crea un problema di prestazioni : in futuro significa che è obsoleto è probabile che la funzione non faccia più parte della libreria, quindi dovresti evitare di usarla in un nuovo codice e cambiare il tuo vecchio codice per smettere di usarla, quindi non ti imbatti in problemi un giorno quando aggiorni i montanti e scopri che la funzione non è più presente


1
A giudicare dall'esperienza, "deprecato" significa davvero "non dovresti più usarlo, ma sarà disponibile per sempre." Almeno per l'API Java standard, non sono a conoscenza di alcun metodo o classe che sia stato effettivamente rimosso dopo essere stato deprecato.
Michael Borgwardt,

1
@Michael Bene, in pratica le API raramente rimuovono le funzioni deprecate perché potrebbero essere deprecate per dieci anni con i compilatori che pubblicano "ATTENZIONE: smetti di usare questo sciocco", e le persone continuerebbero a capovolgere il giorno in cui l'hanno infine rimosso. Penso che deprecato significhi "un giorno vogliamo eliminarlo, quindi per favore smetti di usarlo", anche se in pratica raramente accade davvero
Michael Mrozek,

@Michael Mrozek: non sono d'accordo con l'affermazione It certainly doesn't create a performance issue; è troppo soggettivo per affermarlo.
KM

1
@KMan Una funzione contrassegnata come obsoleta non la rende in qualche modo meno efficiente di prima che fosse contrassegnata - funzionerà esattamente come prima
Michael Mrozek,

@Michael Borgwardt: Funziona così nella maggior parte delle lingue standardizzate. E, naturalmente, se qualcosa di deprecato dovesse essere rimosso dallo standard, le implementazioni popolari lo manterrebbero come estensione.
David Thornley,

8

Non è sbagliato, non è solo raccomandato. Significa generalmente che a questo punto c'è un modo migliore di fare le cose e faresti del bene se usi il nuovo modo migliorato. Alcune cose deprecate sono davvero pericolose e dovrebbero essere evitate del tutto. Il nuovo modo può produrre prestazioni migliori rispetto a quello deprecato, ma non è sempre così.


8

Potresti aver sentito il termine "umorismo autoironico". Questo è l'umorismo che minimizza la tua importanza. Una classe o un metodo deprecato è così. Non è più importante È così poco importante, infatti, che non dovrebbe più essere utilizzato, poiché probabilmente cesserà di esistere in futuro.

Cerca di evitarlo


4
  1. In genere no, non è assolutamente sbagliato utilizzare i deprecatedmetodi purché si disponga di un buon piano di emergenza per evitare problemi se / quando tali metodi scompaiono dalla libreria in uso. Con la stessa API Java questo non accade mai, ma con qualsiasi altra cosa significa che verrà rimosso. Se prevedi specificamente di non aggiornare ( anche se molto probabilmente dovresti a lungo termine ) le librerie di supporto del tuo software, non ci sono problemi nell'uso dei deprecatedmetodi.
  2. No.

3

Sì, è sbagliato

I metodi o le classi obsoleti verranno rimossi nelle versioni future di Java e non dovrebbero essere utilizzati. In ogni caso, dovrebbe esserci un'alternativa disponibile. Usa quello.

Ci sono un paio di casi in cui devi usare una classe o un metodo deprecato per raggiungere un obiettivo del progetto. In questo caso, non hai altra scelta che usarlo. Le versioni future di Java potrebbero infrangere quel codice, ma se è un requisito devi convivere con quello. Probabilmente non è la prima volta che devi fare qualcosa di sbagliato per soddisfare un requisito di progetto, e sicuramente non sarà l'ultimo.

Quando si esegue l'aggiornamento a una nuova versione di Java o di qualche altra libreria, a volte un metodo o una classe che si sta utilizzando diventa obsoleto. I metodi obsoleti non sono supportati, ma non dovrebbero produrre risultati imprevisti. Ciò non significa che non lo faranno, quindi cambia il tuo codice il prima possibile.

Il processo di deprecazione è lì per assicurarsi che gli autori abbiano abbastanza tempo per cambiare il loro codice da una vecchia API a una nuova API. Usa questa volta. Cambia il tuo codice al più presto.


2

Non è sbagliato, ma alcuni dei metodi obsoleti vengono rimossi nelle future versioni del software, quindi potresti finire con il codice non funzionante.


Removed? Vedere la definizione stackoverflow.com/questions/2941900/...
Kman

1
@KMan - nel link che hai pubblicato è scritto - "Il metodo è conservato nell'API per la compatibilità con le versioni precedenti per un periodo di tempo non specificato e potrebbe essere RIMOSSO nelle versioni future." Ho scritto lo stesso: alcuni dei metodi deprecati potrebbero essere rimossi nel prossimo o lontano futuro.
Petar Minchev,

2

È sbagliato usare metodi o classi obsoleti in Java? "

Non sbagliato in quanto tale, ma può farti risparmiare qualche problema. Ecco un esempio in cui è fortemente sconsigliato l'uso di un metodo deprecato:

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

Perché Thread.stop è deprecato?

Perché è intrinsecamente pericoloso. L'arresto di un thread provoca lo sblocco di tutti i monitor che ha bloccato. (I monitor vengono sbloccati quando l'eccezione ThreadDeath si propaga nello stack.) Se uno degli oggetti precedentemente protetti da questi monitor era in uno stato incoerente, altri thread ora possono visualizzare questi oggetti in uno stato incoerente. Si dice che tali oggetti siano danneggiati. Quando i thread operano su oggetti danneggiati, può verificarsi un comportamento arbitrario. Questo comportamento può essere sottile e difficile da rilevare, oppure può essere pronunciato. A differenza di altre eccezioni non controllate, ThreadDeath uccide i thread in silenzio; pertanto, l'utente non ha avvertimento che il suo programma potrebbe essere danneggiato. La corruzione può manifestarsi in qualsiasi momento dopo che si è verificato il danno effettivo, anche ore o giorni in futuro.


Che cosa succede se non cambiare alcun metodo ed eseguire la mia applicazione con avvisi che ho, creerà qualsiasi problema di prestazioni.

Non dovrebbero esserci problemi in termini di prestazioni. L'API standard è progettata per rispettare una certa compatibilità con le versioni precedenti in modo che le applicazioni possano essere gradualmente adattate alle versioni più recenti di Java.


2

È sbagliato usare metodi o classi obsoleti in Java? Non è "sbagliato", funziona ancora ma evitarlo il più possibile.

Supponiamo che esista una vulnerabilità di sicurezza associata a un metodo e che gli sviluppatori stabiliscano che si tratta di un difetto di progettazione. Quindi possono decidere di deprecare il metodo e introdurre il nuovo modo.

Quindi, se usi ancora il vecchio metodo, hai una minaccia. Quindi sii consapevole del motivo della deprecazione e controlla se ti influenza.

cosa succede se non si cambia metodo ed eseguo la mia applicazione con avvisi che ho, creerà qualsiasi problema di prestazioni.

Se l'ammortamento è dovuto a un problema di prestazioni, allora si risentirà di un problema di prestazioni, altrimenti non vi è alcun motivo per avere un tale problema. Ancora una volta vorrei sottolineare, essere consapevoli del motivo della deprecazione.


2

In Java è @Deprecated, in C # è [Obsoleto].

Penso di preferire la terminologia di C #. Significa solo che è obsoleto. Puoi ancora usarlo se vuoi, ma probabilmente c'è un modo migliore.

È come usare Windows 3.1 invece di Windows 7 se ritieni che Windows 3.1 sia obsoleto. Puoi ancora usarlo, ma probabilmente ci saranno funzionalità migliori in una versione futura, inoltre le versioni future saranno probabilmente supportate - quella obsoleta non lo sarà.

Lo stesso vale per Java @Deprecated - puoi comunque utilizzare il metodo, ma a tuo rischio e pericolo - in futuro, potrebbe avere alternative migliori e potrebbe anche non essere supportato.

Se stai usando un codice deprecato, di solito va bene, purché non sia necessario eseguire l'upgrade a una nuova API: il codice deprecato potrebbe non esistere lì. Ti suggerisco di vedere qualcosa che sta usando un codice deprecato, di aggiornarlo per usare le alternative più recenti (questo di solito è indicato sull'annotazione o in un commento deprecato Javadoc).

Modifica: E come sottolineato da Michael, se il motivo della deprecazione è dovuto a un difetto nella funzionalità (o perché la funzionalità non dovrebbe nemmeno esistere), quindi ovviamente non si dovrebbe usare il codice deprecato.


1
"Se stai usando un codice deprecato, va bene, purché non sia necessario eseguire l'upgrade a una nuova API" - non del tutto. Guarda perché Thread.stop () è obsoleto e vedrai che non va bene, in qualsiasi versione di JRE.
Michael,

Ok, dovrei piuttosto dire "di solito" bene (aggiornerò quel bit) :) Quindi, usa a tuo rischio. Ovviamente, se il motivo del deprezzamento è quello di fermare un difetto nella sua funzionalità, ha senso non usarlo. In generale, però, va bene usare un metodo obsoleto. Quindi, tutto dipende dal motivo della deprecazione. Vero.
jamiebarrow,

1

Certo che no - dato che l'intero Java sta diventando @Decre :-) puoi sentirti libero di usarli per tutto il tempo in cui Java dura. Non noterò alcun differenziale, a meno che non sia qualcosa di veramente rotto. Significato: leggere e poi decidere.

In .Net tuttavia, quando qualcosa viene dichiarato [Obsoleto], vai a leggerlo immediatamente anche se non l'hai mai usato prima - hai circa il 50% di possibilità che sia più efficiente e / o più facile da usare rispetto alla sostituzione :-))

Quindi, in generale, può essere molto utile essere tecno-conservatori in questi giorni, ma devi prima fare le tue faccende di lettura.


1

Sento che il metodo deprecato significa; è disponibile un metodo alternativo = ive che è migliore in tutti gli aspetti rispetto al metodo esistente. Meglio usare il buon metodo che il vecchio metodo esistente. Per compatibilità con le versioni precedenti, i vecchi metodi vengono lasciati obsoleti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.