----------------------------------------------------------

Pedro del Gallego's Weblog

« El club de la lucha | Main | Slides monografico... »

20041014 jueves octubre 14, 2004

Anotaciones.
Preparando el monografico de JDK 5.0 he descubierto una caracteristica que me ha llamado la atencion por encima de las demas: las anotaciones.

Con as anotaciones podemos incluir datos sobre nuestro código (meta-datos, para ser mas exactos, incluso meta-meta-datos o meta-meta-meta-...-metadatos, aunque esto lo dejo para proximos post.)

Estas anotaciones no son simples "code-generators" tipo XDoclet, sino que pueden contener informacion para el compilador para la máquina virtual sobre como manejar ese codigo. Tambien se pueden usar para indicar parametros a un contenedor,... y para que mas pueden servir las anotaciones, pues para un monton de ideas locas, pero en lo primero que pense (sobre todo leyendo algunos los ejemplos) es que pronto apareceran muchos proyectos OS que nos indicaran el estado de nuesto código basandose en anotaciones tipo TODO, INPROGRESS, DEPRECATED... Lo importante, es que podemos crear nuestras propias anotaciones (que enprincipio son solo un conjunto muy limitado). Esto inevitablemete nos llevara a que Apache o Sun, creen un JSAL (Java Standard Annotations Library ;)... yo por el momento estoy intentando desarrollar una pequeña libreria de pruebas. con las siguientes anaotaciones:

class Example {

void insert(@NonNull List list, @validate(methodValidate="validate.email", exception = "org.akuma.exception.mailValidationException") String email) {
// code can assume list and o are each not null,
// because an exception will be thrown if they are null
}

@NonNull(menssage="method can´t return null") String getSomething() { // code cannot return null, or exception and/or
// compile time error occurs
}
}

Ejemplo de etiqueta :

import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Documented;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target ({ElementType.PARAMETER})
public @interface NonNull {

String exception() default "java.lang.Exception";
String menssage() default "Parameter can´t be null";
}



Por ahora no se muy bien como modificar el codigo en ejecucion, supongo que a lo bruto podría usar BCEL o algo asi... ya veremos, a ver si hacen los dias un poco mas largos, que no nos da tiempo a hacer todo lo que queremos

( oct 14 2004, 03:53:15 PM CEST ) Permalink Comentarios [1]

URL de la referencia: http://weblogs.javahispano.org/akuma/entry/anotaciones
Comentarios:

Este estilo de "meta-programación" es muy interesante, y ofrece a los programadores nuevas formas de expresar sus ideas a través de una sintaxis que, al menos en principio, es más intuitiva.

Como tu lo mencionas, no tomará mucho tiempo antes de que aparezcan las primeras librerias de anotaciones, así como herramientas de APT. En lo particular, el aspecto más interesante de esta nueva caracteristica del idioma es la poder crear clases "cooperativas" con menos esfuerzo. Por ejemplo, sería muy conveniente escribir algo por el estilo:
<pre>
@Bean(
icon="simple32.png",
desc="Un Bean sin mayor uso"
customizer="SimpleBeanCustomizer",
)
public class SimpleBean implements Serializable {
@Property(name="prop",
private String prop;
//Métodos get/set para prop aquí
@Method(name="foo") //Un método que se publica
public void foo() {
}
public void bar() { //Un método irrelevante para el introspector
}
}
</pre>
y que una clase especial que implemente BeanInfo genere toda la información automáticamente basado en las anotaciones sin que nosotros tengamos que hacer hacer nada, o casi nada.

Por otro lado, esos usos que quieres darle a las anotaciones en Java, particularmente las relacionadas con el diseño por contrato han sido implementadas ultimante en Python 2.4 con su nueva caracteristica de los decoradores. Su sintaxis es parecida a la de Java, pero su función es más que solo anotar el código. Por ejemplo,
<pre>

@decorador
def funcionDecorada():
pass

</pre>
es equivalente a
<pre>

funcionDecorada = decorador(functionDecorada)

</pre>
donde decorador es a su vez una función (o un objeto "callable"). El uso inmediato para la comunidad de Python fue una sintaxis más elegante para declarar métodos estáticos en las clases, pero es evidente que esta notación tiene más usos. Dentro del wiki del sitio de Python se han listado ya varios usos, y las librerias que usan la nueva sintaxis ya estan apareciendo. Como algunos ejemplos, menciono multiple dispatching, debugging, logging, pre/post condicionantes, etc.

Solo el tiempo nos dirá que dirección tome el uso de este nuevo estilo de programación.

Enviado por Jesús Reyes en diciembre 13, 2004 a las 01:00 AM CET #

Enviar un comentario:

Nombre:
Correo electrónico:
URL:

Su comentario:

Sintaxis HTML: Deshabilitado