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

问题描述

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

@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 的未来版本中,您的两个示例都可以正常编译。

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

这不可能,抱歉。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...