注释方法的首选修饰符顺序
Preferred modifier order for annotated methods
根据 JLS (§8.4.3),方法修饰符的首选顺序是
Annotation public protected private abstract static final synchronized native strictfp
前提是注释(如果有)适用于方法 (@Target(METHOD)
)。另一方面 (§9.7.4),return 类型的非 void
方法的任何类型注释都应紧接在类型之前。
所以如果我们有一个方法注解:
@Target(METHOD)
@interface MethodAnnotation {
}
和类型注释:
@Target(TYPE_USE)
@interface TypeAnnotation {
}
那么示例方法的正确(根据首选编码风格)修饰符顺序将是
@MethodAnnotation
public static @TypeAnnotation T foo() {
// ...
}
现在考虑我们有一个适用于方法和类型的 "mixed" 注释:
package com.example;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Retention(RUNTIME)
@Target({METHOD, TYPE_USE})
@interface MethodOrTypeAnnotation {
// empty
}
在方法上使用时,此类注释将应用于 方法及其return 类型。那么首选的代码风格是什么?
public static @MethodOrTypeAnnotation T foo() {
// ...
}
或者下面的版本更好?
@MethodOrTypeAnnotation
public static T foo() {
// ...
}
将注解声明为类型注解和声明注解是bad style。您应该避免创建此类注释。
评论给出了一些 @Nullable
或 @NonNull
注释的示例,这些注释旨在与处理类型注释的现代工具和 [=20= 之前编写的旧工具一起使用] 有类型注释。这种类型和声明注释是一种临时措施,打算在工具支持 Java 8 之前使用,并且不再需要。
link above 给出了其他示例以及如何避免它们。
也就是说,如果您确实有弗兰肯斯坦类型和声明注释,最好将其写在代表其主要含义或在此上下文中使用的位置。
实际上,属性 通常是一个类型 属性,因此注解应该与其他类型注解一起写在类型前面。
根据 JLS (§8.4.3),方法修饰符的首选顺序是
Annotation public protected private abstract static final synchronized native strictfp
前提是注释(如果有)适用于方法 (@Target(METHOD)
)。另一方面 (§9.7.4),return 类型的非 void
方法的任何类型注释都应紧接在类型之前。
所以如果我们有一个方法注解:
@Target(METHOD)
@interface MethodAnnotation {
}
和类型注释:
@Target(TYPE_USE)
@interface TypeAnnotation {
}
那么示例方法的正确(根据首选编码风格)修饰符顺序将是
@MethodAnnotation
public static @TypeAnnotation T foo() {
// ...
}
现在考虑我们有一个适用于方法和类型的 "mixed" 注释:
package com.example;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Retention(RUNTIME)
@Target({METHOD, TYPE_USE})
@interface MethodOrTypeAnnotation {
// empty
}
在方法上使用时,此类注释将应用于 方法及其return 类型。那么首选的代码风格是什么?
public static @MethodOrTypeAnnotation T foo() {
// ...
}
或者下面的版本更好?
@MethodOrTypeAnnotation
public static T foo() {
// ...
}
将注解声明为类型注解和声明注解是bad style。您应该避免创建此类注释。
评论给出了一些 @Nullable
或 @NonNull
注释的示例,这些注释旨在与处理类型注释的现代工具和 [=20= 之前编写的旧工具一起使用] 有类型注释。这种类型和声明注释是一种临时措施,打算在工具支持 Java 8 之前使用,并且不再需要。
link above 给出了其他示例以及如何避免它们。
也就是说,如果您确实有弗兰肯斯坦类型和声明注释,最好将其写在代表其主要含义或在此上下文中使用的位置。 实际上,属性 通常是一个类型 属性,因此注解应该与其他类型注解一起写在类型前面。