微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决哪些注释目标适用于 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 的未来版本中,您的两个示例都可以正常编译。

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

这不可能,抱歉。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。