Nao entendi annotations

pessoal,

explica-me por favor para que serve annotations. Nao entendi ainda. :cry: :cry:

Imagine que toda classe ou membro tem modificadores. Assim, uma classe pode ser definida como public, private, abstract, final e por ai vai. As Annotations são uma forma de você extender essas caracteristicas de acordo com a sua necessidade.

Quando você sobrescreve um metodo de uma classe, o toString() por exemplo, você pode colocar uma annotation @Override de que esse método está sendo sobrescrito. Assim, se o desenvolvedor da sua superclasse alterar a assinatura do meu médodo, o java gerará um erro de compilação indicando que um método com aquela assinatura não existe na superclasse.

Outras utilidades são a eliminação de XMLs para configuração, como ocorreu no EJB3 e no Hibernate Annotations.

Para saber mais: http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html

Annotations s√£o uma esp√©cie de Java doc para outras aplica√ß√Ķes lerem (e n√£o necessariamente seres humanos).

Uma dessas ferramentas √© o compilador, como o colega explicou. Quando voc√™ p√Ķe @Override em cima de um m√©todo, o compilador consegue ler isso e dar avisos aos desenvolvedores das subclasses.

Veja o JUnit. Os desenvolvedores do JUnit precisavam saber quais m√©todos em uma classe eram de testes, quais eram de setup e quais eram de finaliza√ß√£o. Para isso, criaram 3 anota√ß√Ķes:
@Setup
@TearDown
@Test

Agora, o JUnit pode ler uma classe como esta

[code]public class UmaClasse {

@Test
public void displayCorreto {
//Teste do display aqui
}

@SetUp
public void configuraAmbiente {
//Setup da classe
}

}[/code]

E saber que os métodos displayCorreto e configuraAmbiente são os métodos de teste e setup, respectivamente.

Da mesma forma, o Hibernate definiu anotations para que voc√™ possa dizer a ele quais s√£o os atributos que ser√£o persistidos, a qual tabela uma classe pertence, etc. Todas essas s√£o informa√ß√Ķes sobre a classe que o hibernate precisa saber, quando est√° analisando o objeto atrav√©s da reflex√£o.

O legal dos annotations √© que, do contr√°rio do javadoc, essa informa√ß√£o n√£o se perde na compila√ß√£o. Outra coisa bacana √© que voc√™ pode criar suas pr√≥prias anota√ß√Ķes.

Para analisar essa informação utiliza-se reflexão. Até que você esteja familiarizado com reflexão, pode ser que não consiga ver muita utilidadade nelas.

Elas s√£o uma ‚Äúdica‚ÄĚ que algum programa (por exemplo, o compilador, o servidor de aplica√ß√Ķes, um framework etc.) pode usar para modificar o comportamento de alguma classe sua. Em vez de usar configura√ß√£o separada de seu c√≥digo (em arquivos XML que podem ficar fora de sincronia com seu c√≥digo), pode-se fazer configura√ß√£o no pr√≥prio c√≥digo.

Exemplo 1 - EJB 3
No caso do EJB 3, o servidor de aplica√ß√Ķes carrega as suas classes, e verifica que anota√ß√Ķes est√£o associadas a elas. Dessa forma, ele pode criar novas classes a partir das suas, que efetuam o mesmo trabalho que originalmente voc√™ teria de codificar no EJB 2 ou anterior.

Exemplo 2 - JPA e Hibernate 3
Neste caso, a biblioteca carrega as suas classes, e efetua a configuração necessária para que sejam mapeadas para as tabelas do banco de dados.

Exemplo 3 - @Deprecated, @Override e @SupressWarnings
Essas anota√ß√Ķes s√£o entendidas diretamente pelo compilador e indicam para ele que o m√©todo est√° obsoleto (deprecated), que ele deve sobrepor um m√©todo da classe-base (override) ou que ele n√£o deve acusar um determinado ‚Äúwarning‚ÄĚ porque ‚Äúvoc√™ sabe o que est√° fazendo‚ÄĚ (suppress warnings) Assim n√£o √© necess√°rio criar novas palavras-chave na linguagem, e tais anota√ß√Ķes podem ser ignoradas pelo compilador se ele n√£o as entender.

[quote=PePeLeGaL]pessoal,

explica-me por favor para que serve annotations. Nao entendi ainda. :cry: :cry: [/quote]

Uma forma muito, muito ruim de se adicionar metadados necess√°rios a determinada aplica√ß√Ķa/framework ao bytecode de uma classe‚Ķ

Por que voc√™ considera ‚Äúmuito, muito ruim‚ÄĚ?

[quote=psevestre][quote=PePeLeGaL]pessoal,

explica-me por favor para que serve annotations. Nao entendi ainda. :cry: :cry: [/quote]

Uma forma muito, muito ruim de se adicionar metadados necess√°rios a determinada aplica√ß√Ķa/framework ao bytecode de uma classe‚Ķ

[/quote]

Eu fico imaginando se tudo que fosse novo fosse ruim, s√≥ por que √© novo. Fique voc√™ com o IBM WebSphere 4.1 ou o Sun iPlanet 6.0 e veja se voc√™ prefere essas vers√Ķes antigas :stuck_out_tongue:

E só pelo fato de ser novo (e annotations não são o que eu chamaria de novo) tb. não significa ser melhor - vide o Vista.

Acho que já expressei minha opinião sobre annotations em algum outro post, mas vamos lá…

  1. N√£o sou contra se ter bytecode ‚Äúenriquecido‚ÄĚ com metadados, e, muito menos, em se ter a API para recuperar estes metadados - este sim um avan√ßo.

  2. Minha aversão é quanto à forma escolhida para se mesclar os metadados com o fonte - as arrobas espalhadas por todo o lado. O ideal é que isto fosse mascarado pela IDE, algo que elas já fazem com os xdoclets da vida.

  3. IMO, os JSRs deviam é ter definido um schema XML para código fonte (aliás, é bem provavel que exista algum…), diretamente compilável pelo javac. Como o desenvolvimento hoje em dia é feito 99% do tempo usando-se IDEs, o formato de armazenamento é irrelevante (eu só não escolheria um formato binário por trauma do VB3…).

Uma IDE moderna pode muito bem ler o fonte XML e permitir sua edi√ß√£o na forma tradicional. Usando-se ‚Äúprofiles‚ÄĚ adequados, o desenvolvedor ativaria quais anota√ß√Ķes estariam dispon√≠veis, e sua edi√ß√£o poderia ser feita de forma bem mais amig√°vel. Ex: rclick em propriedade -> metadados -> hibernate -> Abre form para edi√ß√£o de metadados de ORM.

Se vc. pensar, j√° que permitiram metadados no n√≠vel de m√©todo e atributos de classe, pq n√£o o fizeram no n√≠vel de senten√ßa ? Eu poderia dar ‚Äúdicas‚ÄĚ para a JVM que permitiriam (ou n√£o) paralelizar determinados grupos de senten√ßas, aproveitando-se dos m√ļltiplos pipelines de instru√ß√£o dos processadores atuais. Esta foi s√≥ a primeira id√©ia que me veio √† cabe√ßa.

Não posso opinar relevantemente sobre as Annotations uma vez que meu estudo sobre tais é básico.

Só quero ressaltar uma opinião já expressa nesse tópico concordando com a idéia de que encher os bytecodes com metadados é uma prática ruim ao meu ver.

Acho as Annotations √ļteis, mas poluir o c√≥digo final com esse tipo de coisa √© algo do qual n√£o sou muito agradado.

Relembrando: opini√Ķes s√£o opini√Ķes.

Post duplicado, por favor, apaguem.

P.S.:
public final String[] ask {
                                    "Só aqui o GUJ sai fora do ar o tempo todo?"
                                    "Sim"
                                    "N√£o"
                                   };

Por outro lado, psilvestre, se a IDE controlasse isso em algum arquivo externo, você passaria a ter 2 arquivos para o fonte de uma só classe, ao invés de um só. Você também seria obrigado a ter uma ide caso quisesse alterar uma anotação (mesmo em campo, caso você quisesse recompilar rapidamente um arquivo para fazer um teste). Eu também não gosto dessa solução.

Também não acho que xml não seja a solução do problema. Meta dados com xml era o que o hibernate já fazia e a solução com o anotation direto ficou muito mais elegante.

Mas, eu concordo com você no seguinte: Arrobas por todo lado no código realmente não são uma coisa legal. Na verdade, eu não estava exatamente discordando de você. Só estava ressaltando que a solução que você apontou também tem pontos ruins.

Qual é a pior delas? Bom, não sei. Por hora é ir usando a que temos por aqui. :slight_smile:

[quote=ViniGodoy]Por outro lado, psilvestre, se a IDE controlasse isso em algum arquivo externo, você passaria a ter 2 arquivos para o fonte de uma só classe, ao invés de um só.
[/quote]

Quem falou em arquivo externo ? A id√©ia √© colocar tudo no mesmo arquivo e, para isto, joga-se fora a representa√ß√£o ‚Äútexto puro‚ÄĚ do fonte e adota-se uma representa√ß√£o XML. As IDEs s√£o perfeitamente capazes de ler o arquivo e mostr√°-lo de forma ‚Äúnormal‚ÄĚ. Pense no XMI, como um exemplo pr√≥ximo.

Por isto é que não sugeri um formato binário, embora um xml (g)zipado provavelmente seria uma solução igualmente aceitável.

Particularmente, prefiro o XML, especialmente pelo fato de utilizar ferramentas que o geram de forma automática junto com as classes do domínio. Ou seja, para mim é como se não existissem - e fico sem as arrobas :wink: