É errado usar métodos ou classes reprovados em Java?

153

Estou usando o eclipse para desenvolver um aplicativo da web. Ainda hoje, atualizei minha versão do struts alterando o arquivo JAR. Estou recebendo avisos em alguns lugares de que os métodos estão obsoletos, mas o código está funcionando bem.

Eu quero saber algumas coisas

  1. É errado usar métodos ou classes reprovados em Java?

  2. E se eu não alterar nenhum método e executar meu aplicativo com os avisos que tenho, isso criará algum problema de desempenho.

Umesh Aawte
fonte
7
Você 'continuaria' a conduzir o seu, 1955 Volkswagen Beetlemesmo que lhe seja oferecido Corvette Stingray, de graça? (0:
KMån
75
@KMan você está comparando um carro europeu para um carro americano ?;)
ponzao
2
@Ponzao e 4outros: Gotcha! (0;
KMån
2
Errado? Estamos falando de privação mortal ou apenas venial aqui?
precisa saber é o seguinte
5
@ Alexander não vota no seu comentário, então marque com +1 o seu também;) em qualquer caso, é difícil que o novo código seja 1000 melhor que o código antigo. A comparação seria melhor entre 1955 Volkswagen Beetlee 1956 Volkswagen Beetlecom pneus novos que você não sabe quando vai quebrar!
28414

Respostas:

265

1. É errado usar métodos ou classes reprovados em Java?

A partir da definição de obsoleto :

Um elemento do programa anotado @ Deprecated é aquele que os programadores são desencorajados de usar, geralmente porque é perigoso ou porque existe uma alternativa melhor.

O método é mantido na API para compatibilidade com versões anteriores por um período não especificado e pode, em versões futuras, ser removido. Ou seja, não, não está errado , mas existe uma maneira melhor de fazê-lo, que é mais robusta contra as alterações da API.

2. E se eu não alterar nenhum método e executar meu aplicativo com os avisos que tenho, isso criará algum problema de desempenho.

Provavelmente não. Ele continuará funcionando como antes da reprovação. O contrato do método API não será alterado. Se alguma estrutura interna de dados mudar em favor de um método novo e melhor, pode haver um impacto no desempenho, mas é bastante improvável.


A depreciação mais engraçada da API Java é imo, the FontMetrics.getMaxDecent. Motivo da reprovação: erro de ortografia.

Descontinuada. A partir do JDK versão 1.1.1, substituído por getMaxDescent ().

aioobe
fonte
5
A próxima depreciação mais engraçada da API Java seria setMultiClickThreshhold (int threshhold) e getMultiClickTreshhold () em AbstractButton (Swing). Prepare-se para os dois! ;)
JavaTechnical
3
Precisamos fazer isso com o HTTP REFERER. É enlouquecedor: en.wikipedia.org/wiki/HTTP_referer
kmiklas
1
@DaveMcClelland, fêz 70 de 69: D;)
VdeX
28

Você ainda pode usar código obsoleto sem alterar o desempenho, mas o objetivo principal de descontinuar um método / classe é permitir que os usuários saibam que agora existe uma maneira melhor de usá-lo e que, em uma versão futura, o código descontinuado provavelmente será removido.

abyx
fonte
1
Como você pode ter certeza de que é sem alterações no desempenho? A privação pode, por exemplo, ser devida a uma alteração de uma estrutura de dados interna, por exemplo, de um HashSet para um TreeSet, por exemplo.
aioobe
@aioobe - No meu entender, o OP perguntou se a chamada de código obsoleto tem algum problema de desempenho, o que não significa que ele não altera o código de byte produzido (antes da versão 1.5 estava em javadoc, agora a anotação está em uso, mas ainda nenhuma alteração no desempenho)
abyx
Ao passar de uma versão de uma biblioteca para outra, não há garantia de que o código de byte de um método na nova versão seja idêntico ao código de byte do mesmo método na versão anterior.
aioobe
@aioobe - há uma garantia de que simplesmente torná-lo obsoleto não mudará o código de bytes, que é o que eu acho que o OP significava. É claro que o próprio código muda, e é por isso que descontinuamos o código.
Abyx
Se você continuar usando a mesma versão de antes, não haverá alterações. Mas se você usar uma versão mais recente da biblioteca e ela não tiver preterido a API, poderá haver uma alteração no desempenho, se a implementação subjacente for drasticamente alterada e a nova API tirar vantagem disso, enquanto a API mais antiga não é tão eficiente como costumava ser, contra essa estrutura mais nova.
gregturn
21

Terminologia

Do glossário oficial da Sun:

descontinuação : refere-se a uma classe, interface, construtor, método ou campo que não é mais recomendado e pode deixar de existir em uma versão futura.

No guia de como e quando descontinuar:

Você pode ter ouvido o termo "humor depreciativo" ou humor que minimiza a importância do interlocutor. Uma classe ou método obsoleto é assim. Não é mais importante. É tão sem importância, de fato, que você não deve mais usá-lo, pois foi substituído e pode deixar de existir no futuro.

A @Deprecatedanotação foi além e alerta sobre o perigo:

Um elemento do programa anotado @Deprecatedé aquele que os programadores são desencorajados de usar, geralmente por ser perigoso ou por existir uma alternativa melhor.

Referências


Certo ou errado?

A questão de saber se é certo ou errado usar métodos obsoletos terá que ser examinada individualmente. Aqui estão TODAS as citações em que a palavra "descontinuado" aparece no Effective Java 2nd Edition :

Item 7: Evitar finalizadores : Os únicos métodos que pretendem garantir a finalização são System.runFinalizersOnExite seu gêmeo maligno Runtime.runFinalizersOnExit. Esses métodos são fatalmente falhos e foram preteridos.

Item 66: Sincronizar o acesso a dados mutáveis ​​compartilhados : As bibliotecas fornecem o Thread.stopmétodo, mas esse método foi preterido há muito tempo porque é inerentemente inseguro - seu uso pode resultar em corrupção de dados.

Item 70: Segurança do encadeamento de documentos : O System.runFinalizersOnExitmétodo é hostil ao encadeamento e foi preterido.

Item 73: Evitar grupos de encadeamentos : Eles permitem aplicar certas Threadprimitivas a um monte de encadeamentos de uma só vez. Várias dessas primitivas foram descontinuadas e as demais são usadas com pouca frequência. [...] grupos de threads estão obsoletos.

Portanto, pelo menos com todos os métodos acima, é claramente errado usá-los, pelo menos de acordo com Josh Bloch.

Com outros métodos, você tem que considerar as questões individualmente, e compreender PORQUE eles estavam obsoletos, mas de um modo geral, quando se justifica a decisão de deprecate, ele tenderá a inclinar-se para errado do que certo para continuar a usá-los.

Perguntas relacionadas

poligenelubricants
fonte
3
"Descontinuado" é do latim "de" + "precare", que significa "orar contra". Quando algo é descrito como obsoleto, um Padrão está orando - implorando - para você não usá-lo; é um aviso de que pode ser removido em uma versão futura desse padrão. Observe que é necessário que um recurso descontinuado seja totalmente implementado em qualquer implementação da versão atual desse padrão. Sua menção ao humor depreciativo é um pouco estranha, no entanto; "auto-depreciativo" nesse sentido é uma corrupção do "auto-depreciativo", que tem uma derivação e significado diferentes.
Dajames
17

Além de todas as excelentes respostas acima, descobri que há outro motivo para remover chamadas de API descontinuadas.

Pesquisando por que uma chamada foi descontinuada, muitas vezes me pego aprendendo coisas interessantes sobre o Java / API / Framework. Muitas vezes, há uma boa razão pela qual um método está sendo preterido e o entendimento dessas razões leva a insights mais profundos.

Portanto, de uma perspectiva de aprendizado / crescimento, também é um esforço que vale a pena

Peter Tillemans
fonte
11

Certamente não cria um problema de desempenho - obsoleto significa que, no futuro, é provável que a função não faça mais parte da biblioteca; portanto, evite usá-lo no novo código e altere o código antigo para parar de usá-lo. você não encontra problemas um dia ao atualizar struts e descobre que a função não está mais presente

Michael Mrozek
fonte
1
A julgar pela experiência, "descontinuado" realmente significa "você não deve mais usar isso, mas estará disponível para todo o sempre". Pelo menos para a API Java Standard, não conheço nenhum método ou classe que realmente seja removido após ter sido descontinuado.
Michael Borgwardt
1
@ Michael Bem, na prática, as APIs raramente removem funções obsoletas porque podem ser obsoletas por dez anos com os compiladores emitindo "AVISO: PARE DE USAR ESTE TOLO", e as pessoas ainda desistem no dia em que finalmente as removem. Acho que obsoleto deve significar "um dia queremos tirar isso, então pare de usá-lo", mesmo que, na prática, isso raramente aconteça de verdade
Michael Mrozek
@ Michael Mrozek: Não concordo com a afirmação It certainly doesn't create a performance issue; é muito subjetivo afirmar isso.
KMån
1
@KMan Uma função que está sendo marcada como obsoleta de alguma forma a torna menos eficiente do que era antes de ser marcada - ela funcionará exatamente da mesma maneira que antes
Michael Mrozek
@ Michael Borgwardt: É assim que funciona na maioria dos idiomas padronizados. E, é claro, se algo descontinuado fosse removido do padrão, as implementações populares o manteriam como uma extensão.
David Thornley
8

Não está errado, apenas não é recomendado. Geralmente, significa que, neste momento, existe uma maneira melhor de fazer as coisas e você faria o bem se usasse a nova maneira aprimorada. Algumas coisas obsoletas são realmente perigosas e devem ser evitadas por completo. A nova maneira pode produzir um desempenho melhor que o obsoleto, mas nem sempre é o caso.

Bozhidar Batsov
fonte
8

Você pode ter ouvido o termo "humor depreciativo". Isso é humor que minimiza sua importância. Uma classe ou método obsoleto é assim. Não é mais importante. É tão sem importância, de fato, que não deve mais ser usado, pois provavelmente deixará de existir no futuro.

Tente evitá-lo

Jigar Joshi
fonte
4
  1. Geralmente não, não é absolutamente errado usar deprecatedmétodos desde que você tenha um bom plano de contingência para evitar problemas se / quando esses métodos desaparecerem da biblioteca que você está usando. Com a própria API Java, isso nunca acontece, mas com praticamente qualquer outra coisa significa que será removido. Se você planeja especificamente não atualizar ( embora você provavelmente deva a longo prazo ) as bibliotecas de suporte do software, não há problema em usardeprecated métodos.
  2. Não.
Esko
fonte
3

Sim, está errado.

Métodos ou classes preteridos serão removidos em versões futuras do Java e não devem ser usados. Em cada caso, deve haver uma alternativa disponível. Use isso.

Existem alguns casos em que você precisa usar uma classe ou método obsoleto para atingir uma meta do projeto. Nesse caso, você realmente não tem escolha a não ser usá-lo. Versões futuras do Java podem quebrar esse código, mas se for um requisito, você precisará conviver com isso. Provavelmente não é a primeira vez que você faz algo errado para atender a um requisito do projeto, e certamente não será o último.

Quando você atualiza para uma nova versão do Java ou alguma outra biblioteca, algumas vezes um método ou classe que você estava usando fica obsoleto. Métodos preteridos não são suportados, mas não devem produzir resultados inesperados. Isso não significa que eles não o façam, portanto, mude seu código o mais rápido possível.

O processo de descontinuação existe para garantir que os autores tenham tempo suficiente para alterar seu código de uma API antiga para uma nova API. Faça uso desse tempo. Altere seu código o mais rápido possível.

Erick Robertson
fonte
2

Não está errado, mas alguns dos métodos descontinuados são removidos nas versões futuras do software; portanto, você pode acabar não trabalhando com o código.

Petar Minchev
fonte
Removed? Veja a definição stackoverflow.com/questions/2941900/…
KMån
1
@KMan - no link que você postou, está escrito - "O método é mantido na API para compatibilidade com versões anteriores por um período não especificado e pode ser REMOVIDO em versões futuras." Eu escrevi o mesmo - alguns dos métodos descontinuados são possivelmente removidos em um futuro próximo ou distante.
Petar Minchev
2

É errado usar métodos ou classes reprovados em Java? "

Não está errado como tal, mas pode poupar alguns problemas. Aqui está um exemplo em que é fortemente desencorajado o uso de um método obsoleto:

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

Por que o Thread.stop foi descontinuado?

Porque é inerentemente inseguro. A interrupção de um encadeamento faz com que ele desbloqueie todos os monitores bloqueados. (Os monitores são desbloqueados à medida que a exceção ThreadDeath se propaga pela pilha.) Se algum dos objetos anteriormente protegidos por esses monitores estivesse em um estado inconsistente, outros segmentos agora poderão exibir esses objetos em um estado inconsistente. Diz-se que esses objetos estão danificados. Quando os threads operam em objetos danificados, pode resultar em comportamento arbitrário. Esse comportamento pode ser sutil e difícil de detectar ou pode ser pronunciado. Diferente de outras exceções não verificadas, o ThreadDeath mata os threads silenciosamente; portanto, o usuário não tem aviso de que seu programa pode estar corrompido. A corrupção pode se manifestar a qualquer momento após o dano real, mesmo horas ou dias no futuro.


E se não alterar nenhum método e executar meu aplicativo com os avisos que tenho, isso criará algum problema de desempenho.

Não deve haver problemas em termos de desempenho. A API padrão foi projetada para respeitar alguma compatibilidade com versões anteriores, para que os aplicativos possam ser gradualmente adaptados às versões mais recentes do Java.

James P.
fonte
2

É errado usar métodos ou classes reprovados em Java? Não está "errado", ainda está funcionando, mas evite-o tanto quanto possível.

Suponha que exista uma vulnerabilidade de segurança associada a um método e os desenvolvedores determinem que é uma falha de design. Portanto, eles podem decidir descontinuar o método e introduzir o novo caminho.

Portanto, se você ainda usa o método antigo, você tem uma ameaça. Portanto, esteja ciente do motivo da reprovação e verifique se isso afeta você.

e se não alterar nenhum método e executar meu aplicativo com os avisos que tenho, isso criará algum problema de desempenho.

Se a depreciação for devido a um problema de desempenho, você sofrerá com um problema de desempenho, caso contrário, não há razão para ter esse problema. Mais uma vez gostaria de salientar, esteja ciente do motivo da depreciação.

Chathuranga Chandrasekara
fonte
2

Em Java é @ Deprecated, em C # é [Obsoleto].

Eu acho que prefiro a terminologia do C #. Significa apenas que é obsoleto. Você ainda pode usá-lo se quiser, mas provavelmente existe uma maneira melhor.

É como usar o Windows 3.1 em vez do Windows 7, se você acredita que o Windows 3.1 é obsoleto. Você ainda pode usá-lo, mas provavelmente há recursos melhores em uma versão futura, além de que as versões futuras provavelmente serão suportadas - a obsoleta não será.

O mesmo para o @ Deprecated do Java - você ainda pode usar o método, mas por seu próprio risco - no futuro, ele pode ter alternativas melhores e nem ser suportado.

Se você estiver usando código reprovado, geralmente é bom, desde que você não precise atualizar para uma API mais recente - o código reprovado pode não existir lá. Sugiro que você veja algo que está usando código obsoleto, para atualizar para usar as alternativas mais recentes (isso geralmente é indicado na anotação ou em um comentário obsoleto do Javadoc).

Edit: E, como apontado por Michael, se o motivo da reprovação for devido a uma falha na funcionalidade (ou porque a funcionalidade nem deveria existir), obviamente, não se deve usar o código obsoleto.

jamiebarrow
fonte
1
"Se você estiver usando código obsoleto, tudo bem, contanto que você não precise atualizar para uma API mais nova" - não exatamente. Veja por que Thread.stop () está obsoleto e você verá que não está bem em qualquer versão do JRE.
Michael
Ok, eu prefiro dizer "normalmente" bem (atualizará esse bit) :) Portanto, use por sua conta e risco. Obviamente, se o motivo da sua reprovação é impedir uma falha em sua funcionalidade, faz sentido não usá-la. Em geral, porém, é bom usar um método obsoleto. Então, tudo depende do motivo da depreciação. Verdade.
precisa saber é o seguinte
1

Claro que não - já que todo o Java está recebendo @ Deprecated :-), você pode usá-los pelo tempo que o Java durar. Não vou notar nenhuma diferença, a menos que seja algo realmente quebrado. Significado - tem que ler sobre isso e depois decidir.

No .Net, no entanto, quando algo é declarado [Obsoleto], leia-o imediatamente, mesmo se você nunca o tiver usado antes - você tem cerca de 50% de chance de ser mais eficiente e / ou mais fácil de usar do que substituir :-))

Portanto, em geral, pode ser bastante benéfico ser tecnoconservador hoje em dia, mas você deve fazer sua tarefa de leitura primeiro.

ZXX
fonte
1

Eu sinto que esse método obsoleto significa; existe um método alternativo disponível que é melhor em todos os aspectos do que o método existente. Melhor usar o bom método do que o antigo método existente. Para compatibilidade com versões anteriores, os métodos antigos são deixados como obsoletos.

DPM
fonte