哪些注释目标适用于Java记录?
我有一个用于如下定义的方法或字段的注释:哪些注释目标适用于Java记录?,java,annotations,java-record,java-16,Java,Annotations,Java Record,Java 16,我有一个用于如下定义的方法或字段的注释: @Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD, ElementType.FIELD}) public @interface NotColumn { } 我想防止用户在记录上使用此注释,因为在该上下文中使用此注释是没有意义的。似乎这样做不应该编译,因为我没有将ElementType.PARAMETER指定为有效的@Target 不过,以下内容很好: publ
@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不适用于这种声明”进行编译,这正是我所期望的
public record MyRecord(String customerId,
String companyName,
@NotColumn String description
public MyRecord {
}
}
description
可能看起来有点像一个参数,但就注释目标而言,严格来说并不仅仅如此。它也可以像一个领域
自(此版本突出显示了与记录相关的已更改部分):
可以传播记录类的记录组件上的注释
中指定的记录类的成员和构造函数
第8.10.3节的要点是,注释(如@NotColumn
)仅当适用于生成的方法、字段和参数时,才会传播到这些方法、字段和参数上。否则,它们将被忽略。您的注释适用于字段,因此它将传播到记录的生成的description
字段
而且已经修好了。无论是否指定构造函数,注释的有效性都应该是相同的。在Java的未来版本中,两个示例都可以很好地编译
我想阻止用户在记录上使用此[注释]
这是不可能的,对不起。谢谢!这对我15岁以下的测试是不好的。它在16岁以下工作正常。没关系,我可以测试并忽略注释并记录该行为。如果注释允许任何目标字段、参数、方法或记录组件,则会将其传播到相应的位置。如果允许多个,则会将其传播到多个位置。如果不允许任何注释,则注释不适用,并导致错误。如果阻止您的意思是不允许用户成功编译代码,则您可以针对您的用例使用
@allargsconstuctor
的示例。实现细节需要在那里跟进。@Naman谢谢,但我的库没有依赖项。对我来说,添加警告日志非常简单,我将对此进行记录。
public record MyRecord(String customerId,
String companyName,
@NotColumn String description