对嵌套类类型参数进行注释的方法之间有什么区别


org.jetbrains.annotations.NotNull
public static void func(Foo.Bar.@NotNull Baz arg0) {
}

public static void func(@NotNull Foo.Bar.Baz arg0) {
}

public static void func(@NotNull Foo.Bar.@NotNull Baz arg0) {
}

对嵌套类类型参数进行注释的方法之间有什么区别?

推荐哪一个?

这些只是语法上的不同。从语义上讲,它们都意味着";该参数不应为null";,实际上,三者都编译为对参数进行相同的null检查。

这三部作品之所以都是因为NotNullTYPE_USEElementType,所以你可以注释任何";类型使用";用CCD_ 4。Foo.Bar中的Bar使用了类型Bar,所以您可以通过执行Foo.@NotNull Bar来对其进行注释。

这就提出了为什么NotNull首先具有ElementType.TYPE_USE的问题。这当然不允许你有三种方式来表达完全相同的事情。一个更可能的原因是允许你这样做:

List<@NotNull String> listWithNotNullElements;

不管怎样,这三个都编译为相同的字节码,就像在所有三种情况下一样,NotNull正在注释参数

以下三项:

package io.github.sweeper777;
import org.jetbrains.annotations.NotNull;
public class Main {
public static void main(String[] args) {
}
public void f( Foo.@NotNull Bar x) {
}
}
class Foo {
static class Bar {
}
}
package io.github.sweeper777;
import org.jetbrains.annotations.NotNull;
public class Main {
public static void main(String[] args) {
}
public void f(@NotNull Foo.@NotNull Bar x) {
}
}
class Foo {
static class Bar {
}
}
package io.github.sweeper777;
import org.jetbrains.annotations.NotNull;
public class Main {
public static void main(String[] args) {
}
public void f(@NotNull Foo.Bar x) {
}
}
class Foo {
static class Bar {
}
}

编译为:

Compiled from "Main.java"
public class io.github.sweeper777.Main {
public io.github.sweeper777.Main();
Code:
0: aload_0
1: invokespecial #1                  // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: return
public void f(io.github.sweeper777.Foo$Bar);
Code:
0: aload_1
1: ifnonnull     8
4: iconst_0
5: invokestatic  #36                 // Method $$$reportNull$$$0:(I)V
8: return
private static void $$$reportNull$$$0(int);
Code:
0: ldc           #38                 // String Argument for @NotNull parameter '%s' of %s.%s must not be null
2: iconst_3
3: anewarray     #2                  // class java/lang/Object
6: dup
7: iconst_0
8: ldc           #39                 // String x
10: aastore
11: dup
12: iconst_1
13: ldc           #40                 // String io/github/sweeper777/Main
15: aastore
16: dup
17: iconst_2
18: ldc           #41                 // String f
20: aastore
21: invokestatic  #47                 // Method java/lang/String.format:(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
24: new           #49                 // class java/lang/IllegalArgumentException
27: dup_x1
28: swap
29: invokespecial #52                 // Method java/lang/IllegalArgumentException."<init>":(Ljava/lang/String;)V
32: athrow
}

相关内容

最新更新