09 maio 2007

Herança em Anotações Java

Brincando com o Hibernate Validator hoje, notei que seria uma ótima idéia ter herança de anotações em Java. Algo que atualmente não é permitido. Realmente, senti falta dessa funcionalidade.

Comecei escrevendo um POJO simples para configurar algumas validações de @Range, quando notei a repetição. Esta anotação recebe dois parametros min e max, ficando assim:
class User {
@Range(min=6, max=20)
private String password;
...
}

Mas, obviamente este é o mais simples dos simplérrimos exemplos onde quero demonstrar apenas o uso da anotação e porque herança seria algo útil. Em muitos outros atributos, inclusive de outras classes, gostaria de aplicar o mesmo @Range e atualmente a única solução é copiando/colando a definição.

E se eu pudesse fazer isso:
public @interface Range6to20 extends @Range(min=6, max=20) {}

Não seria ótimo? Bastaria um @Range6to20 nos atributos que quero, e tenho apenas um ponto para alterar o range, caso seja necessário futuramente. (Ok, o nome da classe iria ficar em desacordo com os valores, mas e daí? é um exemplo!... e também, o refactor do Eclipse renomeia as referencias... então... não é um problema).

Quem já viu as anotações do Struts 2 para o Validator? Ficam enormes não é? E se você pudesse estender e colocar separadamente a configuração numa anotação especializada, e de quebra ainda poder reutilizá-la em outros lugares? :D Seria ótimo, não?

Pesquisei na web algo sobre herança de anotações, mas o máximo que encontrei foi alguém comentando que também gostaria de ter, e que soube que o assunto foi discutido pelo Expert Group da respectiva JSR, só não soube dizer porque essa funcionalidade não foi incorporada. Talvez alguém saiba?

O que vocês acham? :)

[]'s!!
miojo

3 comentários:

Alexandre Bairos disse...

@Scope(IOCConstants.PERTHREAD_SCOPE)
public class ...

Se o seu objetivo é apenas DRY, o uso de constantes resolve. []s

marcospereira disse...

Hum, verdade, até que herança para anotações não seria má ideia. Mas, enquanto isso ainda não existe, isso não resolve o teu problema?

Paulo Silveira disse...

Oi Bruno.

Ate onde eu li, o time da especificacao decidiu nao colocar herança e nem multiplas anotacoes por causa de dar complexidade a uma feature nova na linguagem... Nao concordo muito, mas foi o que li

Contato

Email:bruno.borges(at)gmail.com

LinkedIn: www.linkedin.com/in/brunocborges
Twitter: www.twitter.com/brunoborges
Comprei e Não Vou
Rio de Janeiro, RJ Brasil
Oracle
São Paulo, SP Brasil