quarta-feira, abril 20, 2005

Anotações no Tiger

Comecei a usar com mais força alguns recursos do Tiger, a nova versão de Java, e apesar de à primeira vista algumas coisas terem jeitão de sugar syntax, a maioria das inovações deixou a linguagem bem mais prática. O loop for a lá foreach é um exemplo disso porque não chega a inovar, mas apenas melhorar, iterações sobre arrays ou coleções de objetos. Lembro que quando comecei a programar em Java eu detestava ter que fazer algo assim:
List objects = ...
...
Iterator iterator = objects.iterator();
while(iterator.hasNext()) {
Something some = (Something)iterator.next();
...
}
Claro, depois que descobri a maneira "correta" de se fazer isso era:
List objects = ...
...
for(Interator it = objects.iterator();it.hasNext();) {
Something some = (Something)iterator.next();
...
}
Não chega a ser tão diferente do while, e também, não tem a legibilidade de um foreach:
List objects = ...
for(Something some: objects) {
...
}
Bem melhor, não?! Mas, até agora a feature que tem sido mais útil para mim são annotations. Poder dar a uma classe, metodo, atributo, parametro, whatever mais informações do que apenas um nome e tipo é algo extremamente poderoso. Agora, por exemplo, estou trabalhando em um pequeno conjunto de anotações que me permita traduzir atributos de uma classe para campos de um documento do Lucene. Já havia feito algo semelhante com reflexão apenas, mas o treco fica tão genérico que chega a não valer a pena já que trato todos os atributos de maneira completamente uniforme. Decidi então criar a seguinte anotação:
@Documented
@Target( ElementType.FIELD )
@Retention( RetentionPolicy.RUNTIME )
public @interface LuceneField {

String name();
boolean index() default true;
boolean store() default false;
boolean tokenize() default true;
float boost() default 1.0f;

}
Com ela posso descrever os atributos de uma classe num nível de granularidade impossível de ser alcançado apenas com reflection. Para exemplificar, vejamos a seguinte classe:
public class People implements Serializable {

@LuceneField(index=true,
tokenize=false,
store=true,
name="peopleid")
private Long id;

@LuceneField(index=true,
tokenize=true,
store=true,
name="peopleName")
private String name;

@LuceneField(index=true,
tokenize=false,
store=true,
name="peopleEmail")
private String email;

// some stuff

}
Depois, uma helper class traduz objetos dessa classe e de qualquer outra que use as anotações para um Document. Bem legal e relativamente fácil de implementar. Há ainda outras anotações, mas eu mostro depois quando a idéia estiver mais amadurecida. Para escrever essa tralha toda baixei o Eclipse3.1M6 que também tem boas novidades e as incompatibilidades de sempre com plugins feitos para a versão anterior. Por falar em forward/backward compatibility, esse é um dos problemas com o código atual que estou produzindo, nem adianta MESMO tentar usar em uma versão anterior do Java. De qualquer modo, como estou em um ambiente muito controlado, não vale a pena esperar (mais ainda) para usar as novas features em aplicações reais.

valeuz...

4 Comentarios:

Blogger Marcos Silva Pereira disse...

Depois eu altero esse post para aceitar algumas partes de codigo que não passam pelo editor do blogger.

valeuz...

3:46 PM  
Anonymous Anônimo disse...

Thank you!
[url=http://wbytqpzl.com/leeq/yizp.html]My homepage[/url] | [url=http://ipxhaknj.com/rykr/xcfp.html]Cool site[/url]

9:53 PM  
Anonymous Anônimo disse...

Nice site!
My homepage | Please visit

9:53 PM  
Anonymous Anônimo disse...

Great work!
http://wbytqpzl.com/leeq/yizp.html | http://hwfhekuz.com/bejq/wary.html

9:53 PM  

Postar um comentário

<< Home