根据 JLS ( §8.4.3 ),方法修饰符的首选顺序是
Annotation public protected private abstract static final synchronized native strictfp
前提是注释(如果有)适用于方法 ( @Target(METHOD)
)。另一方面(第 9.7.4 节),非方法返回类型的任何类型注释void
都应紧接在类型之前。
所以如果我们有一个方法注解:
@Target(METHOD)
@interface MethodAnnotation {
}
和类型注释:
@Target(TYPE_USE)
@interface TypeAnnotation {
}
那么示例方法的正确(根据首选编码风格)修饰符顺序将是
@MethodAnnotation
public static @TypeAnnotation T foo() {
// ...
}
现在考虑我们有一个适用于方法和类型的“混合”注释:
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
}
当在方法上使用时,这样的注释将应用于方法及其返回类型。那么首选的代码风格是什么?
public static @MethodOrTypeAnnotation T foo() {
// ...
}
或者也许下面的版本更好?
@MethodOrTypeAnnotation
public static T foo() {
// ...
}