System.Attribute vs java.lang.annotation.Annotation

Siempre es necesario contar con informacion adicional sin ser mezclada con las reglas de negocio, esta informacion puede tener distintos propositos, ya sean reglas impuestas por la organizacion o informacion necesaria pero sin afectar las reglas de negocio.

En este post no prentendo crear un debate sobre las distintas tecnologias, mi opinion es neutral y creo que ambas son fabulosas aplicadas correctamente.

En cuanto a esta informacion adicional, ya sean metadatos o atributos, si bien para .Net esta tecnologia lleva varias versiones presente para Java es incoorporada a partir de su version 5.

Para mostrar las diferencias en implementacion entre ambos mostrare un ejemplo que permita agregar datos de autor y version en las clases y metodos declarados. Por cuestiones de antigüedad comenzare con .Net.

[System.AttributeUsage(System.AttributeTargets.Class |
                       System.AttributeTargets.Struct,
                       AllowMultiple = true)]
public class Author : System.Attribute
{
    private string name;
    public double version;
    public Author(string name)
    {
        this.name = name;
        version = 1.0;
    }
}

La explicacion es sencilla, se hereda de la clase Attribute, se pueden agregar atributos a esta clase como pueden ser si la clase es serializable, si es visible en un componente COM, que alcance tiene la clase que en nuestro ejemplo solamente tiene aplicacion en clases y metodos, a continuacion agrego otra clase la cual utilizaria este atributo.

[Author("H. Ackerman", version = 1.1)]
[Author("M. Knott", version = 1.2)]
class SampleClass
{
    // H. Ackerman's code goes here...
    // M. Knott's code goes here...
}

Estos ejemplos fueron tomados de la pagina de msdn

Ahora metadatos con Java

import java.lang.annotation.*;

@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Author{
    String name();
    double version() default 1.0;
}

Segun se en java no se permite repetir las anotaciones, por lo que veo una desventaja en su contra, a continuacion el ejemplo. En cuanto a su explicacion, segun he visto se crea a partir de una clase generica, aun cuando esta es una interface, y sus miembros parecen ser funciones.

@Author(name ="H. Ackerman", version = 1.1)
class SampleClass
{
    // H. Ackerman's code goes here...
}