`ElementType.FIELD`对`ElementType.TYPE_USE`

时间:2016-06-18 15:44:17

标签: java annotations

我没有完全理解注释变量和注释其类型之间的区别。 在这种情况下,我是否更喜欢类型注释而不是声明注释?

@EmailField // can be used on String or Array/Collection of String-s
private String email;
private @EmailType String email2;
@EmailField
private List<@EmailType String> emails;

@Target(ElementType.TYPE_USE)
@interface EmailType {}

@Target(ElementType.FIELD)
@interface EmailField {}

2 个答案:

答案 0 :(得分:1)

Java 8中的类型注释主要用于支持更强类型检查。

来自https://docs.oracle.com/javase/tutorial/java/annotations/type_annotations.html

  

创建类型注释以支持改进的Java分析   程序确保更强类型检查的方法。 Java SE 8发布   不提供类型检查框架,但它允许您编写   (或下载)一个类型检查框架,实现为一个或   更多可与Java一起使用的可插拔模块   编译器。

从上面的示例中,您应该使用@EmailField字段注释,并且还应添加@Retention(RetentionPolicy.RUNTIME),以便您可以使用反射在运行时检查此注释,如下所示:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface EmailField {}

答案 1 :(得分:1)

以下是声明注释和类型注释之间的区别:

  • 字段上的声明注释提供有关变量的信息,例如该字段已弃用,客户端应使用getter方法。
  • 类型注释提供有关的信息,例如整数值大于零。

您的注释提供有关值的信息:字符串应该是合法的电子邮件地址。因此,您应该使用类型注释apic loopback(尽管我只是将其命名为@EmailType)。

您可以在编译时,运行时或两者都验证类型注释。