代码之家  ›  专栏  ›  技术社区  ›  sproketboy

Java记录与带有字段和参数的注释混淆?

  •  0
  • sproketboy  · 技术社区  · 5 年前

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

    @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 {
       }
    }
    
    0 回复  |  直到 5 年前
        1
  •  5
  •   Michael    5 年前
    public record MyRecord(String customerId,
                           String companyName,
                           @NotColumn String description
    

    description 可能看起来有点像参数,但出于注释目标的目的,它不是 严格地 就这样。它也可以像一个领域。

    从…起 the JLS (此版本突出显示了与记录相关的更改部分):

    可以传播记录类的记录组件上的注释 中指定的记录类的成员和构造函数 8.10.3 .

    第8.10.3节的要点是 @NotColumn 被传播到生成的方法、字段和参数上 只有当它们适用于这些目标时 。否则将忽略它们。注释适用于字段,因此它将传播到生成的 描述 记录的字段。

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

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

    这不可能,抱歉。