gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:30:07 25 4
gpt4 key购买 nike

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

@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,
String companyName,
@NotColumn String description
public MyRecord {
}
}

最佳答案

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

description 可能看起来有点像参数,但出于注解目标的目的,严格来说 并非如此。它也可以像一个场一样。

来自 the JLS (此版本突出显示了记录方面发生变化的部分):

Annotations on a record component of a record class may be propagatedto members and constructors of the record class as specified in8.10.3.

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

The fact that you get an error when adding a constructor is a bug并且已经修复。无论您是否指定构造函数,注释的有效性都应该是相同的。在未来的 Java 版本中,您的两个示例都可以正常编译。

I wanted to prevent users from using this [annotation] on a record

这不可能,抱歉。

关于java - 哪些注释目标适用于 Java 记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67074911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com