Dúvida quanto a uma determinada anotação(@SuppressWarnings)

Java

19/05/2011

O que realmente essa anotação faz? Pelo título dela, parece que ela suprime alguma mensagem ou warning, ou seja, não lança na app. É isso mesmo que eu estou entendendo ou não? Já ouvi dizer que isso é gambi, mas gambi onde? Em que momento?

@SuppressWarnings("unchecked")
Pjava

Pjava

Curtidas 0

Melhor post

Anthony Accioly

Anthony Accioly

19/05/2011

Oi PJava, exatamente, essa anotação impede o compilador de disparar exceções de um determinado tipo.
No caso se exceções "unchecked", isso acontece devido a mistura de código que usa Generics com código que não usa Generics. Até o Java 5, não existia o mecanismo de Generics, isso significa que uma List podia receber qualquer coisa. Existe muito código legado desse naipe que precisa continuar compatível com as novas versões do Java.

O problema é que quando você mistura código sem o uso de genéricos com código que usa genéricos, o compilador não tem como detectar se a lista só contém objetos do tipo especificado. Veja o exemplo de um código problemático:
   List abacate = new ArrayList();   abacate.add("Eu sou uma String");   List bola = abacate;   int pato = bola.get(0);

Veja que esse código compila tranqüilamente, porém irá disparar uma java.lang.ClassCastException em tempo de execução. É por isso que o compilador emite um Warning dizendo que essa é uma operação potencialmente perigosa.
Bom, aí é que está. Cabe ao programador garantir que a List abacate só contenha inteiros quando passa ela para a referência parametrizada bola. Se você sabe que abacate só contém inteiros, então esse cast é seguro. Você indica isso com a anotação @SuppressWarnings("unchecked"). 

Eu não vejo essa anotação como gambiarra, pelo contrário, não usando ela você receberá vários Warnings ao fazer casting do resultado de ferramentas como o Hibernate, Apache Commons Collections, etc, em código que não apresenta risco. A idéia do @SuppressWarnings("unchecked") é limpar as mensagens de compilação, de forma que outros programadores possam se preocupar apenas com warnings reais (minha experiência em projetos que não usavam @SuppressWarnings é que os programadores simplesmente começavam a ignorar todo tipo de Warning, deixando de detectar bugs cabeludos por causa disso).

GOSTEI 1

Mais Respostas

Anthony Accioly

Anthony Accioly

19/05/2011

A declaração de generics do código anterior não foi parsada corretamente pela ferramenta do fórum.
A terceira linha na verdade é
  List<Integer> bola = abacate; 


Abraços,
GOSTEI 1
Davi Costa

Davi Costa

19/05/2011

Só complementando é bem simples essa anotação ele serve para mostrar ao desenvolvedor, que possivelmente pode acontecer um erro em tempo de execução, puro e simplesmente só isso e vc anota com ele para mostrar que está ciente.


Att Davi
GOSTEI 0
Anthony Accioly

Anthony Accioly

19/05/2011


essa anotação ele serve para mostrar ao desenvolvedor, que possivelmente pode acontecer um erro em tempo de execução
 


Você quis dizer que o Warning serve para mostrar que pode acontecer um erro em tempo de execução, e a anotação server para indicar que você está ciente, correto?
GOSTEI 0
Davi Costa

Davi Costa

19/05/2011

Como Java é fortemente tipado, as ide's tem inteligência bastante para em determinados momentos te mostrar que pode haver um erro em execução, por exemplo, com certeza pela sua experiência vc já usou um criteria do Hibernate ou do JPA.

As vezes na declaração do nosso método retornamos uma lista de um Objeto (vamos supor Usuario), mas criteria.list() retorna  retorna um List e não um List<Usuario>, mais isso não gera erro de compilação. Mas nossas ide's tão inteligentes que são nos segere a colocarmos essa anotação @SuppressWarnings("unchecked"), como quem diz assim, olha cuidado pode ser que essa lista que vc está retornando não seja de Usuario não, pode acontecer algum erro em execução esteja ciente disso. Acontece muito também quando usamos métodos depreciados, ou usamos alguns conjuntos sem o auxílio de Generics, como Map ou List...

Espero ter sido mais claro agora.

Obrigado por elevar o nível da discussão

att Davi
GOSTEI 0
Anthony Accioly

Anthony Accioly

19/05/2011

Só completando. As IDES Java geralmente fazem algo chamado "compilação incremental em segundo plano", além, é claro, da análise do código. No caso de unsafe casting, quando é detectado um warning durante a compilação, a IDE pode ser configurada para exibir uma dica dizendo: "Olha, existem várias soluções possíveis para esse warning. Você gostaria de eliminar a tipagem original? Gostaria de parametrizar a classe do outro lado? Gostaria de colocar um @SuppressWarnings("unchecked")? Clicando nas sugestões a própria IDE é capaz de consertar o problema para você. Essa atenção aos pequenos detalhes é algo fenomenal. (Eis uma boa resposta para aquele seu amigo pentelho de C# que ficam dizendo que o Visual Studio é bem mais rápido pois Java é lento. Explique para ele todo o esforço que o IDE tem que fazer para dar essas dicas mão na roda e mostre que, apesar do Visual Studio ser uma IDE excelente, nesse ponto as IDEs de Java ainda tem o Upper Hand).
Eu reparei que o Netbeans 7.0, na minha máquina, por algum motivo, veio com as sugestões relacionadas a warnings desativadas. Se o mesmo caso ocorrer para algum de vocês, siga os seguintes passos para ativá-las:
Clique em Tools no menu superiorEntre no submenu OptionsClique no botão Editor na parte superior da janelaClique na aba HintsSelecione Java no combo box LanguageNa árvore de configuração procure por Standard Javac warningsVocê pode tanto checar todas as warnings do Javac quanto somente algumas subcategorias (tipo Unchecked). Basta ticar o que você achar necessário.Clique em ok. 
GOSTEI 0
POSTAR