Sobre deprecated

11 respostas
Rafael_Afonso

Olá:

Quando quero declarar um método como deprecated tenho que fazer algo como:

/**
* @deprecated Faca outra coisa
*/
public void metodoDepreciado() { ... }

Assim, para verificar se um determinado método está depreciado o compilador verifica se dentro do comentário javadoc existe a String “@deprecated”. Ora, Comentários foram feitos justamente para serem ignorados pelo compilador :? ! Isso inclui os comentários javadocs.
Creio que isso foi uma bola fora dos criadores do Java. Na minha humilde opinião seria mais adequado se “deprecated” fosse uma palavra-chave, usada como abaixo:

public void metodoDepreciado() deprecated("Faça outa coisa") { ... }

Será que não há algum expert do JCP que não tenha pensado nisso? Qual a opinião de vocês?

Grato,

11 Respostas

Rafael_Steil

Ha 2 problemas em fazer o que voce sugeriu:

  1. Seria necessario fazer alteracao no codigo fonte, o que certamente nao eh a melhor coisa;
  2. usar @deprecated faz com que isso tambem apareca na documentacao da classe. Se fosse da outra maneira, ou nao apareceria na documentacao, ou vc teria que adicionar o comentario MAIS a alteracao no codigo… nao eh algo mto bom de fazer.

Como voce disse, comentarios sao ignorados, porem nesse caso ate eh uma solucao bem razoavel, e soh facilita a vida do programador.

Rafael

Rafael_Afonso

Quando abro um código fonte e acrescento a tag @deprecated, estou alterando o código de qualquer forma. Se bem que não na parte “funcional”.

Basta alterara o programa gerador do Javadoc para que ele reconheça deprecated e exiba o aviso de depreciação. Se o Javadoc é inteligente o suficiente para verificar se um determinado método está sobrepondo outro método de mesma assinatura de alguma super-classe, não deve ser difícil ele tratar de deprecated.
Reconheço que este assunto é um tanto acadêmico, e que provavelmente não vai resultar em nada. Apenas acho que se pudesse retornar no tempo e recriar o Java, este seria um aspecto que eu levaria em consideração.

Grato,

Rafael_Steil

Eu realmente me referia a parte funcional. E isso eh um problema.
A solucao que voce propoe eh muito mais sucetivel a erros. Depois, o programa que cria o Javadoc nao tem influencia alguma na hora de compilacao, logo ele nao pode “tratar deprecated”.

Rafael

Rafael_Afonso

Sim, o gerador do Javadoc não influencia a compilação. Mas se ele pode, digamos, dizer se um método é public, abstract, syncronized, etc. simplesmente procurando por estas palavras no cabeçalho deste método, a mesma coisa poderia ser feita com a depreciação.

mlopes

Concordo,

eu diria que seria melhor algo como

public deprecated void theMethod…

[]'s

richardpeder

Rafael:
Me perdoe a curiosidade…mas qual o motivo que leva vc a declarar um método como depreciado? pelo que sei, quando vc usa métodos de API’s antigas do Java, ao compilar ele diz que existe metodos depreciados em sua classe, dai vc da -deprecated, algo assim, na hora de compilar e ele mostra, correto? então, pedindo desculpas novamente pela curiosidade, mas o que leva vc a querer declarar algo deste tipo??

Ate mais…

Bani

Bom, não sei o caso específico do Rafael Afonso, mas o motivo que leva alguém a declarar algo como deprecated é o mesmo que leva as pessoas que mantém a API do Java a fazerem isso.

Você fez seu método em uma classe, está todo mundo usando, e um certo dia você percebe que estava meio ruim daquele jeito, mas que se você simplesmente “consertar”, o código de outras pessoas pode parar de agir como esperado. Então você marca o método como deprecated e faz um novo para substituí-lo, aí as pessoas que pegarem a nova versão da sua classe e estiverem usando esse método serão informadas sobre a mudança.

richardpeder

Bani:

Acho que vc esta querendo falar em “versionamento de métodos” não eh? bom, se caso for isso, com certeza eh muito interessante, pois sempre vc faz um metodo e ele tem erros, dai vc vai la, faz uma atualização dele e marca a anterior como deprecated…massa!! :lol:

Obrigado e ate mais…

Bani

É por aí, mas o ideal é sempre tentar corrigir seu próprio método se isso não for impactar ninguém.
O deprecated é só para quando realmente a mudança é meio “radical” e aí precisa fazer um novo.

Rafael_Afonso

Richardpeder:

Quanto os motivo para declarar um metodo deprecated, a Bani respondeu por mim.

“richardpeder”:
Rafael:
Me perdoe a curiosidade…mas qual o motivo que leva vc a declarar um método como depreciado? pelo que sei, quando vc usa métodos de API’s antigas do Java, ao compilar ele diz que existe metodos depreciados em sua classe, dai vc da -deprecated, algo assim, na hora de compilar e ele mostra, correto? então, pedindo desculpas novamente pela curiosidade, mas o que leva vc a querer declarar algo deste tipo??

Ate mais…

dukejeffrie

Não se marca como deprecated uma versão de um método.

Você marca o método inteiro. E depois não tem mais volta, a menos que vc queira uma bagunça.
Um método é deprecated quando ele provavelmente será removido da API.

Quando vc faz código para outras pessoas usarem, às vezes vc se depara com essas coisas: erros graves em situações específicas, ou comportamentos que não existem mais.

Por exemplo:

Tag tag = new Tag();
  tag.setType(Tag.TITLE_TYPE);

Vc tem uma constante inteira que te permite setar o tipo da tag. Mas vc de repente percebe que essa abordagem é horrível e resolve criar uma classe TagType que vai fazer a tarefa difícil para você:

Tag tag = new Tag();
  TagType title = new TagType();
   title.setBold(true);
   title.setBig(true);
   tag.setType(title);

E agora?? Vc quer que todo mundo use o jeito novo, mas existe código de outros que chama seu método inteiro! Vc torna-o deprecado e faz uma gambiarra para que uma chamada ao método antigo ainda funcione. Mas ele eventualmente vai sumir.

Repare na classe java.util.Date, que é um caso clássico… :slight_smile:

aquelão!!

Criado 28 de fevereiro de 2003
Ultima resposta 6 de mar. de 2003
Respostas 11
Participantes 6