3

我有一个注释用于这样定义的方法或字段:

@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.FIELD})
public @interface NotColumn {
}

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

以下编译得很好:

public record MyRecord(String customerId,
                       String companyName,
                       @NotColumn String description
}

但是这种带有紧凑构造函数的表单无法使用“ java: annotation type not applicable to this kind of declaration ”进行编译——这实际上是我所期望的。

public record MyRecord(String customerId,
                       String companyName,
                       @NotColumn String description
   public MyRecord {
   }
}
4

1 回答 1

4
public record MyRecord(String customerId,
                       String companyName,
                       @NotColumn String description

description可能看起来有点像一个参数,但出于注释定位的目的,严格来说不仅仅是这样。它也可以像一个字段一样工作。

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

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

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

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

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

这是不可能的,对不起。

于 2021-04-13T12:50:48.700 回答