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{
}
对于标记注解,只需要声明注解类型的名称即可。在使用注解时,善用这些简化的方式可以减少代码量。