Java注释:声明为方法但值设置为属性的元素

时间:2016-02-22 10:10:12

标签: java annotations

当我们创建自定义注释时,我们将元素声明为方法,然后将值设置为属性。

例如,我们在这里声明了一个自定义注释ComponentType,其元素name()description()看起来像方法。

public @interface ComponentType {
    String name();// declared as method
    String description();
}

使用注释时,它们如下所示:

@ComponentType(name = "userContainer", // value looks like an attribute
               description = "a user container")
public class UserEntity { }

我的问题是:为什么Java不允许将元素声明为属性,如下所示?

public @interface ComponentType {
    String name; // Compilation Error
    String description;
}

2 个答案:

答案 0 :(得分:2)

如果注释的属性在界面中没有定义作为抽象方法,那么它们就是成员。类似的东西:

public @interface ComponentType {
    String name;
    String description;
}

但是,界面中的所有成员都是隐式final(和static),上面的代码无法编译,因为namedescription未初始化。

但如果他们实际上是用一些值初始化的话:

public @interface ComponentType {
    String name = "name";
    String description = "description";
}

然后就像下面那样的片段是不可能的:

@ComponentType(
  name = "userContainer" //cannot assign a value to a final variable 
, description = "a user container")

答案 1 :(得分:0)

我的观察是:

Java将注释视为接口的特殊类型,因此:

  1. 与界面类似,我们只能在注释中声明最终属性:

    String appName = "test application";//final attribute, never reset value
    
  2. 注释可能只包含抽象方法(在没有实现的情况下声明的方法)。

    public @interface ComponentType {
      String name();// declared as abstract method
    
  3. 当我们通过注释注释元素(例如类,方法,属性)时,我们需要设置那些抽象方法的返回值, 看起来像属性但实际上充当实现。

    @ComponentType(name = "userContainer"//set return value of method name()
    
  4. 我们可以通过简单地调用注释的抽象方法来使用我们在注释元素中设置的值(例如,类,方法,属性)。

    Annotation annotation = annotatedClassObject.getAnnotation(ComponentType.class);
    ComponentType componentType = (ComponentType) annotation;
    String someName = componentType.name(); //returns value set during annotating
    
  5. 界面

    一样
    • 注释永远不支持声明任何非最终属性。
    • 注释可能包含一些抽象方法,我们需要设置返回值 注释元素中的抽象方法(例如,类,方法, 属性)。
      

    期待更多反馈/回答