Pedro del Gallego's Weblog
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:
- @NotNull : Una etiqueta que indique que un parametro no puede ser nulo, seria una buena forma de de empezar a tener mas en cuenta el "diseño basado en contrato", esta genial etiqueta no es nueva, y C# tiene algo parecido.
- @pre : Contendria un conjunto regla de asserciones que se deben cumplir antes de ejecutar un metodo
- @post : Contendria un conjunto regla de asserciones que se deben cumplir despues de ejecutar un metodo
- @Validate : Una etiqueta que el parametro debe ser parametro debe ser validado por el metodo X.xxx()
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