È sbagliato usare metodi o classi deprecate in Java?

Sto usando eclipse per sviluppare un’applicazione web. Proprio oggi ho aggiornato la versione dei miei montanti modificando il file JAR. In alcuni punti sto ricevendo avvertimenti che i metodi sono deprecati, ma il codice funziona correttamente.

Voglio sapere alcune cose

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

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

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

Dalla definizione di deprecato :

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

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

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

Molto probabilmente no. Continuerà a funzionare come prima della deprecazione. Il contratto del metodo API non cambierà. Se alcune strutture interne dei dati cambiano a favore di un nuovo metodo migliore, potrebbe esserci un impatto sulle prestazioni, ma è piuttosto improbabile.


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

Deprecato. A partire da JDK versione 1.1.1, sostituito da getMaxDescent ().

È ancora ansible utilizzare il codice deprecato senza che le prestazioni vengano modificate, ma l’intero punto di deprecazione di un metodo / class è di far sapere agli utenti che esiste ora un modo migliore di usarlo e che in una versione futura il codice deprecato sarà probabilmente rimosso.

Terminologia

Dal glossario ufficiale Sun:

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

Dalla guida how-and-when a deprecate:

Potresti aver sentito il termine “umorismo autoironico” o umorismo che minimizza l’importanza dell’oratore. Una class o un metodo deprecato è così. Non è più importante È così poco importante, infatti, che non dovresti più usarlo, poiché è stato sostituito e potrebbe cessare di esistere in futuro.

L’annotazione @Deprecated andata oltre e mette in guardia dal pericolo:

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

Riferimenti

  • java.sun.com Glossario
  • Guida linguistica / Come e quando dequalificare API
  • Tipo di annotazione API deprecata

Giusto o sbagliato?

La questione se sia giusto o sbagliato utilizzare metodi deprecati dovrà essere esaminata su base individuale. Ecco TUTTE le virgolette in cui la parola “deprecato” appare in Effective Java 2nd Edition :

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

Articolo 66: Sincronizzazione dell’accesso ai dati mutabili condivisi : le librerie forniscono il metodo Thread.stop , ma questo metodo è stato ritirato molto tempo fa perché intrinsecamente non sicuro : il suo utilizzo può provocare il danneggiamento dei dati.

Articolo 70: Sicurezza del thread del documento : il metodo System.runFinalizersOnExit è thread-hostile ed è stato deprecato.

Articolo 73: Evita gruppi di thread : ti permettono di applicare certe primitive di Thread a un gruppo di thread contemporaneamente. Molti di questi primitivi sono stati deprecati e il resto viene utilizzato di rado. […] i gruppi di thread sono obsoleti.

Quindi, almeno con tutti i metodi di cui sopra, è chiaramente sbagliato utilizzarli, 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 sbagliato di destra per continuare a usarli.

Domande correlate

  • Differenza tra un’API deprecata e legacy?

Oltre a tutte le eccellenti risposte sopra riportate ho trovato un altro motivo per rimuovere le chiamate API deprecate.

Stai cercando il motivo per cui una chiamata è deprecata Spesso mi trovo a imparare cose interessanti su Java / l’API / il Framework. C’è spesso una buona ragione per cui un metodo viene deprecato e la comprensione di questi motivi porta ad approfondimenti più approfonditi.

Quindi, da una prospettiva di apprendimento / crescita, è anche uno sforzo utile

Certamente non crea un problema di prestazioni – mezzi deprecati in futuro è probabile che la funzione non faccia più parte della libreria, quindi dovresti evitare di usarla nel nuovo codice e cambiare il tuo vecchio codice per smettere di usarlo, quindi non ti imbatti in problemi un giorno quando aggiorni puntoni e scopri che la funzione non è più presente

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

Cerca di evitarlo

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

  1. Generalmente no, non è assolutamente sbagliato usare metodi deprecated se si dispone di un buon piano di emergenza per evitare problemi se / quando tali metodi scompaiono dalla libreria che si sta utilizzando. Con la stessa API Java questo non succede mai, ma con qualsiasi altra cosa significa che verrà rimosso. Se si prevede in particolare di non eseguire l’upgrade ( anche se molto probabilmente si dovrebbe, a lungo termine ), le librerie di supporto del software, allora non ci sono problemi nell’utilizzo di metodi deprecated .
  2. No.

Sì, è sbagliato.

I metodi o le classi deprecati verranno rimossi nelle versioni future di Java e non dovrebbero essere utilizzati. In ogni caso, dovrebbe essere disponibile un’alternativa. Usalo.

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

Quando esegui l’aggiornamento a una nuova versione di Java o un’altra libreria, a volte un metodo o una class che stavi utilizzando diventa deprecato. I metodi deprecati non sono supportati, ma non dovrebbero produrre risultati imprevisti. Ciò non significa che non lo faranno, quindi, cambia il codice al più presto.

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 questo tempo. Cambia il tuo codice su ASAP.

Non è sbagliato, ma alcuni dei metodi deprecati vengono rimossi nelle versioni future del software, quindi si rischia di finire con un codice non funzionante.

È sbagliato usare metodi o classi deprecate 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’interruzione di un thread lo fa sbloccare tutti i monitor che ha bloccato. (I monitor sono sbloccati poiché l’eccezione ThreadDeath si propaga nello stack.) Se uno qualsiasi degli oggetti precedentemente protetti da questi monitor si trovava 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 o potrebbe essere pronunciato. A differenza di altre eccezioni non controllate, ThreadDeath uccide i thread in modo silenzioso; quindi, l’utente non ha avvertimento che il suo programma potrebbe essere corrotto. La corruzione può manifestarsi in qualsiasi momento dopo che si è verificato il danno reale, anche in ore o giorni in futuro.


Cosa succede se non cambi alcun metodo ed esegui la mia applicazione con avvertimenti che ho, creerà qualsiasi problema di prestazioni.

Non ci dovrebbero essere problemi in termini di prestazioni. L’API standard è progettata per rispettare alcune compatibilità con le versioni precedenti, in modo che le applicazioni possano essere adattate gradualmente alle nuove versioni di Java.

È sbagliato usare metodi o classi deprecate in Java? Non è “sbagliato”, funziona ancora, ma evitalo il più ansible.

Supponiamo che vi sia 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 la nuova strada.

Quindi, se usi ancora il vecchio metodo, hai una minaccia. Quindi, sii consapevole del motivo della deprecazione e controlla se il modo in cui influisce su di te.

cosa succede se non cambi alcun metodo ed esegui la mia applicazione con avvertimenti che ho, creerà qualsiasi problema di prestazioni.

Se la deprecazione è dovuta a un problema di prestazioni, si verificherà un problema di prestazioni, altrimenti non c’è motivo di avere un problema simile. Ancora una volta vorrei sottolineare, essere consapevoli del motivo della deprecazione.

Certo che no – dal momento che l’intero Java sta ricevendo @Deprecated 🙂 puoi sentirti libero di usarli finché dura Java. Non noterete mai alcuna diff, a meno che non sia qualcosa di veramente rotto. Significato – devi leggere su di esso e poi decidere.

In .Net, tuttavia, quando qualcosa viene dichiarato [Obsoleto], vai a leggerlo immediatamente anche se non lo 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 prima devi fare il tuo compito di lettura.

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 utilizzare Windows 3.1 anziché Windows 7 se si ritiene che Windows 3.1 sia obsoleto. Puoi ancora usarlo, ma probabilmente ci sono funzionalità migliori in una versione futura, inoltre le versioni future saranno probabilmente supportate – quella obsoleta non lo sarà.

Lo stesso vale per Java @Deprecated: è comunque ansible utilizzare il metodo, ma a proprio rischio e pericolo: in futuro potrebbe avere alternative migliori e potrebbe non essere nemmeno supportato.

Se si sta utilizzando un codice deprecato, in genere va bene, a condizione che non sia necessario eseguire l’aggiornamento a un’API più recente, poiché il codice deprecato potrebbe non esistere. Suggerisco di vedere qualcosa che sta usando codice deprecato, di aggiornare per usare le alternative più recenti (questo di solito è indicato nell’annotazione o in un commento deprecato Javadoc).

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

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