Las anotaciones son sólo metadatos (o DecorativeData, como algunos pueden preferir), información adicional sobre el código que está escrito. Normalmente siempre se hace una analogía con el Post-it colgado en la mitad de su código fuente: las anotaciones no ejecutan código.
El uso adecuado de las anotaciones sigue el estilo "Enabling". ¿No direccionan en ningún camino, no indican la ejecución de ningún código. Por el contrario, como metadatos, sólo permiten diferentes usos de esta información adicional. Un buen ejemplo sería la anotación @Entity, de la API de Java Persistencia:
@Entity
public class Vehiculo {
// …
}
Varios frameworks, e incluso otras partes de su sistema puede utilizar esta información adicional si así lo desean. El propio Hibernate utiliza esta información para saber que esta es una clase persistente, que debe tener representación en la base de datos, un validador puede utilizar esta información para determinar qué objetos deben ser validados en esta clase, un framework de aspectos podría decidir aplicar un aspecto en esta Clase utilizando esta información adicional, entre muchas otras posibilidades. Otro ejemplo interesante podría ser la anotación @transient, de la propia especificación JPA:
public class Bicicleta {
@Transient
private double velocidad;
}
Se podría utilizar esta información para decidir no mostrar este campo en la interfaz gráfica de usuario (web o de escritorio). Puede utilizar esta información extra incluso para decidir que este campo no será enviado en mensajes de correo electrónico o incluso en logs. Framework de ORM como Hibernate aprovechan esta información para ignorar el atributo y no incluirlo en ninguna tarea de persistencia.
¿Se podrían dar muchos más ejemplos de buenas prácticas de anotaciones. Lo más importante es la idea de que la anotación permite múltiples usos, y no direcciona - no fuerza - ningún camino. La anotación no está asociada a ninguna ejecución de código. Funciona incluso como un simple post-it.
El enfoque alternativo sería el pensamiento "Directing". En este caso, la anotación está directamente relacionada con la ejecución del código y sólo sirve para este fin. Ejemplo:
public class Sistema {
@EnviaEmail(Emails.CONFIRMACION)
public void registro(Usuario usuario) {
//…
}
}
En este caso no hay ningún otro uso para esta anotación. Tenga en cuenta que ella ya presupone una ejecución del código para el envío de mensajes de correo electrónico. Limita a un pensamiento particular, para un uso específico. Tal vez un caso exagerado, mas no hay diferencia alguna con el llamado al método directo que envía el e-mail:
public class Sistema {
public void registro(Usuario usuario) {
mensajero.enviaEmail(Emails.CONFIRMACION, usuario);
// …
}
}
En algunos casos puede ser muy difícil, o demasiado subjetiva para decidir si el uso de una anotación es "Directing" (Directivo) o es "Enabling" (habilitante). No creo que deberíamos tomar nada como la verdad absoluta, lo importante es ser consciente de varios puntos de vista diferentes. Así, podemos tomar nuestras decisiones, siempre pesando ventajas y desventajas.
Y pueden pensar en algún otro uso interesante de las anotaciones? Enabling o Directing?