0

根据 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() {
        // ...
}
4

1 回答 1

2

将注释声明为类型注释和声明注释是不好的风格。您应该避免创建此类注释。

注释给出了一些注释作为示例@Nullable@NonNull它们旨在与处理类型注释的现代工具和在 Java 具有类型注释之前编写的旧工具一起使用。这种类型和声明注释是一种临时措施,打算在该工具支持 Java 8 之前使用,并且不再需要。上面的链接提供了其他示例以及如何避免它们。

也就是说,如果您确实有 Frankenstein 类型和声明注释,最好将其写在代表其主要含义的位置或在此上下文中使用的位置。在实践中,属性通常是类型属性,因此注释应该与其他类型注释一起写在类型前面。

于 2017-08-24T23:13:31.047 回答