java - 在 Java 限定类型中有注释 tmesis/inside 的目的是什么?

标签 java java-8 annotations

这有什么目的吗static @NotNull @Other My.@NotNull @Other Builder createBuilder()

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

public class A {
    static class My {
        static class Builder {
            public My build() {
                return new My(); } } }

    @Target({ElementType.METHOD, ElementType.TYPE_USE})
    public @interface NotNull { }

    @Target({ElementType.METHOD, ElementType.TYPE_USE})
    public @interface Other { }

    public static @NotNull @Other My.@NotNull @Other Builder createBuilder() {
        return new My.Builder();
    }
}

最佳答案

使用这种结构的主要原因是向后兼容。
在 Java 8 之前,没有类型注释,因此通常使用方法注释来实际描述方法的返回类型,例如

@Target(ElementType.METHOD)
public @interface NotNull { }

@Target(ElementType.METHOD)
public @interface Other { }

public static @NotNull @Other My.Builder createBuilder() {
    return new My.Builder();
}
从 Java 8 开始,您可以对返回类型本身进行注释,这就是您通常会做的事情。但是为了支持仍在寻找方法注释的旧工具,您可以保留 @Target METHOD .对于由简单名称组成的返回类型,方法注解和返回类型注解的代码位置是相同的,因此您可以同时创建一个方法注解和一个返回类型注解,一次出现,即
@MethodAndTypeAnnotation ReturnType method() …
但是,对于限定名称,语法是不同的,因为类型注释必须紧接在被注释元素的简单名称之前,即
@Target(ElementType.TYPE_USE)
public @interface NotNull { }

@Target(ElementType.TYPE_USE)
public @interface Other { }

public static My.@NotNull @Other Builder createBuilder() {
    return new My.Builder();
}
对于使用 public static @NotNull @Other My.Builder createBuilder() 的纯类型注释会导致编译器错误,因为它会尝试注释 My此处仅用作限定符,而不是实际的类型使用。请注意,如果 Builder是内部类而不是嵌套类(即不是 static ),注释外部类型是合法的,尽管不太可能是需要的。
所以在你的情况下
@Target({ElementType.METHOD, ElementType.TYPE_USE})
public @interface NotNull { }

@Target({ElementType.METHOD, ElementType.TYPE_USE})
public @interface Other { }

//            method annotation    type annotation
public static @NotNull @Other   My.@NotNull @Other Builder createBuilder() {
    return new My.Builder();
}
两种情况都需要注释方法和返回类型。如前所述,如果Builder是一个内部类,第一次出现对外部类型进行注释是合法的,无论您是否愿意,它都会对其进行注释。
因此,总的来说,不建议将“类型使用”注释范围与其他范围混合使用,而是更新代码处理工具仍然需要方法或字段注释的任务,这些任务实际上是类型注释的工作。

如前所述,对于简单的名称,您可以同时注释方法和返回类型,当您使用 import 时,这也适用于嵌套类型。陈述。但这需要顶级类在一个包中:
package example;

import example.A.My.Builder;

public class A {
    static class My {
        static class Builder {
            public My build() {
                return new My(); } } }

    @Target({ElementType.METHOD, ElementType.TYPE_USE})
    public @interface NotNull { }

    @Target({ElementType.METHOD, ElementType.TYPE_USE})
    public @interface Other { }

    public static @NotNull @Other Builder createBuilder() {
        return new My.Builder();
    }
}

关于java - 在 Java 限定类型中有注释 tmesis/inside 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65614890/

相关文章:

java - isAfter isBefore Java 8 LocalDateTime 一日不同

java - 如何编写注释/方面以不进入方法但在给定条件为 false 时返回 null?

configuration - Doctrine2 实体命名空间

java - 为什么 Maven 总是要下载一堆东西

java - 可完成的 future | thenApply 与 thenCompose

java - 如何从发布构建中排除模块

java - 将 watch 置于断点时,Java 调试器显示盒装整数而不是原始整数

java - 使用 Spring CrudRepository 的 Hibernate LazyInitializationException

Java,对数字列表求平均值

java - Spring security 重叠 URL 范围