问题描述
@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:注释类型不适用于这种声明”进行编译 - 这实际上是我所期望的。
public record MyRecord(String customerId,@NotColumn String description
public MyRecord {
}
}
解决方法
public record MyRecord(String customerId,String companyName,@NotColumn String description
description
可能看起来有点像参数,但就注释定位而言,严格来说并非如此。它也可以充当一个字段。
来自 the JLS(此版本突出显示了与记录有关的更改部分):
记录类的记录组件上的注解可能会被传播 中指定的记录类的成员和构造函数 8.10.3。
第 8.10.3 节的要点是,诸如 @NotColumn
之类的注解仅在它们适用于这些目标时才传播到生成的方法、字段和参数上。。否则它们将被忽略。您的注释适用于字段,因此它将传播到记录的生成的 description
字段。
The fact that you get an error when adding a constructor is a bug 并且已经修复。无论您是否指定构造函数,注释的有效性都应该是相同的。在 Java 的未来版本中,您的两个示例都可以正常编译。
我想阻止用户在记录上使用这个[注释]
这不可能,抱歉。