哪些注释目标适用于 Java 记录?

spr*_*boy 4 java annotations java-record java-16

我有一个用于定义方法或字段的注释,如下所示:

@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.FIELD})
public @interface NotColumn {
}
Run Code Online (Sandbox Code Playgroud)

我想阻止用户在记录上使用此注释,因为在该上下文中使用此注释没有意义。看来这样做不应该编译,因为我没有指定ElementType.PARAMETER为有效的@Target.

不过,以下编译良好:

public record MyRecord(String customerId,
                       String companyName,
                       @NotColumn String description
}
Run Code Online (Sandbox Code Playgroud)

但是这种带有紧凑构造函数的形式无法使用“ java:注释类型不适用于这种声明”进行编译 - 这实际上是我所期望的。

public record MyRecord(String customerId,
                       String companyName,
                       @NotColumn String description
   public MyRecord {
   }
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 7

public record MyRecord(String customerId,
                       String companyName,
                       @NotColumn String description
Run Code Online (Sandbox Code Playgroud)

description可能看起来有点像参数,但出于注释目标的目的,严格来说它并不只是这样。它也可以像一个场一样。

来自JLS(此版本突出显示了与记录有关的更改部分):

记录类的记录组件上的注释可以传播到记录类的成员和构造函数,如 8.10.3中指定的。

第 8.10.3 节的要点是,仅当注释(例如您的注释适用于这些目标)时,它们才会@NotColumn传播到生成的方法、字段和参数上。否则它们会被忽略。您的注释适用于字段,因此它将传播到记录的生成字段。description

添加构造函数时出现错误的事实是一个错误,并且已经得到修复。无论您是否指定构造函数,注释的有效性都应该是相同的。在 Java 的未来版本中,您的两个示例都可以正常编译。

我想阻止用户在记录上使用此[注释]

这是不可能的,抱歉。

  • 如果注释允许使用任何目标 FIELD、PARAMETER、METHOD 或 RECORD_COMPONENT,则会将其传播到相应的位置。如果允许多个,则它会传播到多个地方。如果不允许,则注释不适用并产生错误。 (7认同)
  • 谢谢!这是我在 15 下测试的坏处。它在 16 下工作正常。没关系,我可以测试并忽略注释并记录该行为。 (2认同)