8.4.3 使用注解类型

注解类型的使用并不复杂,只需要在源代码的程序元素上以“@”加注解类型名称的方式进行声明即可。如果注解类型中包含了元素,则需要对所有不包含默认值的元素都指定一个值。比如,要把代码清单8-23中的注解类型Author应用到一个Java类上,可以使用代码清单8-25中给出的方式。Author中的元素name和email没有默认值,需要在使用注解类型时显式指定。对于包含默认值的配置元素也可以指定值。

代码清单8-25 注解类型的使用示例


@Author(name="Alex",email="alex@example.org")

public class MyClass{

}


如果注解类型中只包含一个元素,且这个元素的名称是value,那么在使用注解类型时可以省略元素的名称。比如,代码清单8-24中的Employee注解类型可以按照代码清单8-26中的方式来使用。代码清单8-26中的用法“@Employee(EMPLOYEE_TYPE.REGULAR)”等价于“@Employee(value=EMPLOYEE_TYPE.REGULAR)”,只是使用上更加简洁。只有当注解类型中使用value作为唯一的配置元素的名称时,才能使用这种简洁的写法。

代码清单8-26 注解类型的简洁使用示例


@Employee(EMPLOYEE_TYPE.REGULAR)

public class AnotherClass{

}


如果注解类型中包含类型为数组的配置元素,那么在使用时有一些特殊的地方要注意。比如,代码清单8-27的注解类型WithArrayValue中包含一个类型为Class<?>[]的元素。

代码清单8-27 包含数组类型的注解类型声明


@Target(ElementType.TYPE)

public@interface WithArrayValue{

String name();

Class<?>[]appliedTo();

}


使用该注解类型的方式如代码清单8-28所示。对于数组类型的配置元素,使用“{}”来包含数组中具体的值。如果数组中的值只有一个,那么可以省略掉“{}”。注解声明“@WithArrayValue(name="Test",appliedTo={String.class})”和“@WithArray-Value(name="Test",appliedTo=String.class)”在作用上是等价的。

代码清单8-28 包含数组类型的注解类型的使用示例


@WithArrayValue(name="Test",appliedTo={String.class, Integer.class})

public class ArrayClass{

}


对于标记注解,只需要声明注解类型的名称即可。在使用注解时,善用这些简化的方式可以减少代码量。