Java 注释方法的首选修饰符顺序

Java 注释方法的首选修饰符顺序,java,java-8,annotations,jls,type-annotation,Java,Java 8,Annotations,Jls,Type Annotation,根据JLS(),方法修饰符的首选顺序是 注释公共保护私有抽象静态最终同步本机strictfp 前提是注释(如果有)适用于方法(@Target(METHOD))。另一方面(),非void方法的返回类型的任何类型注释都应该紧跟在该类型之前 因此,如果我们有一个方法注释: @Target(TYPE_USE) @interface TypeAnnotation { } @Target(方法) @接口方法注释{ } 和类型注释: @Target(TYPE_USE) @interface TypeAn

根据JLS(),方法修饰符的首选顺序是

注释公共保护私有抽象静态最终同步本机strictfp
前提是注释(如果有)适用于方法(
@Target(METHOD)
)。另一方面(),非
void
方法的返回类型的任何类型注释都应该紧跟在该类型之前

因此,如果我们有一个方法注释:

@Target(TYPE_USE)
@interface TypeAnnotation {
}
@Target(方法)
@接口方法注释{
}
和类型注释:

@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() {
        // ...
}

将注释同时声明为类型注释和声明注释是不正确的。您应该避免创建这样的注释

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

也就是说,如果你确实有一个弗兰肯斯坦类型和声明注释,那么最好将它写在代表其主要含义的位置,或者在这个上下文中使用的位置。
实际上,属性通常是类型属性,因此注释应该与其他类型注释一起编写,放在类型前面。

将注释声明为类型注释和声明注释是不正确的。您应该避免创建这样的注释

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

也就是说,如果你确实有一个弗兰肯斯坦类型和声明注释,那么最好将它写在代表其主要含义的位置,或者在这个上下文中使用的位置。
实际上,属性通常是类型属性,因此注释应该与其他类型注释一起编写,放在类型前面。

投票以“主要基于意见”结束。我的意见是,同时使用
方法
类型_USE
的注释会非常混乱,因为它同时应用两次,所以我建议您应该避免这样的注释。像许多其他事情一样,仅仅因为语言允许它,并不意味着你应该使用它。@Andreas好的,但是大多数
@Nullable
@NonNull
注释都有
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER,ElementType.LOCAL_VARIABLE,ElementType.TYPE_use})
,真的吗<代码>非空仅为
类型_USE
。我也是。它是
方法
,而不是
类型_USE
。那么你所指的“大多数”是什么呢?好的,不是全部,而是一些,例如,请参见
org.jetbrains.annotations.NotNull
()。你指的是jetbrains
@NotNull
,而不是
@NonNull
?如果是这样,当在一个方法上给出它时,它实际上应用于该方法的返回值(null值禁止返回(对于方法)),因此我建议您应该注释返回类型,而不是方法。如果注释方法意味着它应用于所有参数,如
@NonNullByDefault
所做的,那么您应该注释方法,而不是返回值。本质上,把它放在对代码读者有意义的地方,这样意图就很清楚了。投票决定以“主要基于意见”的方式结束。我的意见是,同时使用
方法
类型_USE
的注释会非常混乱,因为它同时应用两次,所以我建议您应该避免这样的注释。像许多其他事情一样,仅仅因为语言允许它,并不意味着你应该使用它。@Andreas好的,但是大多数
@Nullable
@NonNull
注释都有
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER,ElementType.LOCAL_VARIABLE,ElementType.TYPE_use})
,真的吗<代码>非空仅为
类型_USE
。我也是。它是
方法
,而不是
类型_USE
。那么你所指的“大多数”是什么呢?好的,不是全部,而是一些,例如,请参见
org.jetbrains.annotations.NotNull
()。你指的是jetbrains
@NotNull
,而不是
@NonNull
?如果是这样,当在一个方法上给出它时,它实际上应用于该方法的返回值(null值禁止返回(对于方法)),因此我建议您应该注释返回类型,而不是方法。如果注释方法意味着它应用于所有参数,如
@NonNullByDefault
所做的,那么您应该注释方法,而不是返回值。本质上,把它放在对代码读者有意义的地方,这样意图就清楚了。