注释 tmesis/inside Java 限定类型的目的是什么?
What is the purpose of having annotation tmesis/inside Java qualified types?
这是有目的的吗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 之前,没有类型注释,因此方法注释通常用于实际描述方法的 return 类型,例如
@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 开始,您可以注释 return 类型本身,这就是您通常会做的。但是为了支持仍在寻找方法注释的旧工具,您可以保留 @Target
METHOD
。对于简单名称组成的return类型,方法注解和return类型注解的代码位置相同,所以可以同时创建方法注解和return类型注解一次出现的时间,即
@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
是内部 class 而不是嵌套 class(即不是 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();
}
两次出现都需要注释方法和 return 类型。如前所述,如果 Builder
是内部 class,则第一次出现时注释外部类型是合法的,并且无论您是否愿意,它都会对其进行注释。
所以一般来说,不建议将“类型使用”注释范围与其他注释范围混合使用,而是建议更新代码处理工具仍然需要方法或字段注释的任务,而这些任务实际上是类型注释的工作。
如前所述,对于简单的名称,您可以同时注释方法和 return 类型,这在您使用 import
语句时也适用于嵌套类型。但这需要顶级class在一个包中:
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();
}
}
这是有目的的吗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 之前,没有类型注释,因此方法注释通常用于实际描述方法的 return 类型,例如
@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 开始,您可以注释 return 类型本身,这就是您通常会做的。但是为了支持仍在寻找方法注释的旧工具,您可以保留 @Target
METHOD
。对于简单名称组成的return类型,方法注解和return类型注解的代码位置相同,所以可以同时创建方法注解和return类型注解一次出现的时间,即
@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
是内部 class 而不是嵌套 class(即不是 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();
}
两次出现都需要注释方法和 return 类型。如前所述,如果 Builder
是内部 class,则第一次出现时注释外部类型是合法的,并且无论您是否愿意,它都会对其进行注释。
所以一般来说,不建议将“类型使用”注释范围与其他注释范围混合使用,而是建议更新代码处理工具仍然需要方法或字段注释的任务,而这些任务实际上是类型注释的工作。
如前所述,对于简单的名称,您可以同时注释方法和 return 类型,这在您使用 import
语句时也适用于嵌套类型。但这需要顶级class在一个包中:
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();
}
}