Java 我们应该总是使用@NotNull还是@Nullable?

Java 我们应该总是使用@NotNull还是@Nullable?,java,intellij-idea,annotations,nullable,notnull,Java,Intellij Idea,Annotations,Nullable,Notnull,我们是否应该始终在方法参数中使用@NotNull或@Nullable,即使它看起来很明显 @NotNull public static int add(@NotNull int a, @NotNull int b) { return a + b; } 澄清: 现在我知道不能将null传递给基元变量,但我想问,如果我有一个方法(带有非基元参数),可以将null传递给该方法,该怎么办?但是从该方法的名称来看,显然不能传递null,因为例如,不能向null添加某些内容 @NotNull pu

我们是否应该始终在方法参数中使用
@NotNull
@Nullable
,即使它看起来很明显

@NotNull
public static int add(@NotNull int a, @NotNull int b) {
    return a + b;
}
澄清:

现在我知道不能将
null
传递给基元变量,但我想问,如果我有一个方法(带有非基元参数),可以将
null
传递给该方法,该怎么办?但是从该方法的名称来看,显然不能传递null,因为例如,不能向
null
添加某些内容

@NotNull
public static Integer add(@NotNull Integer a, @NotNull Integer b) {
    return a + b;
}

在Java基本类型中,例如
int
永远不能
null
,这是由编译器强制执行的,因此代码中的注释完全不需要

即使您设法将
整数
作为参数传递(通过自动取消装箱),在大多数情况下也不允许使用
null
值:

add(1, (Integer) null);
=> Null pointer access: This expression of type Integer is null but requires auto-unboxing.
但是,如果null确实设法作为参数传递(例如,如果其中一个参数是
null
属性),注释将不会阻止它,从而导致运行时
NullPointerException
。如果您非常关心传递
null
值(您不应该这样做),那么可以使用它优雅地处理其中一个参数为
null
的情况:

public static Optional<Integer> add(Integer a, Integer b) {
    if (a == null || b == null)
        return Optional.empty();
    return Optional.of(a + b);
}
公共静态可选添加(整数a、整数b){
如果(a==null | | b==null)
返回可选的.empty();
返回可选。of(a+b);
}

现在,调用者有责任确定如果无法计算值该怎么办,另外一个好处是调用者现在意识到这可能发生。

在Java基本类型中,如
int
永远不能
null
,这是由编译器强制执行的,因此,代码中的注释是完全不必要的

即使您设法将
整数
作为参数传递(通过自动取消装箱),在大多数情况下也不允许使用
null
值:

add(1, (Integer) null);
=> Null pointer access: This expression of type Integer is null but requires auto-unboxing.
但是,如果null确实设法作为参数传递(例如,如果其中一个参数是
null
属性),注释将不会阻止它,从而导致运行时
NullPointerException
。如果您非常关心传递
null
值(您不应该这样做),那么可以使用它优雅地处理其中一个参数为
null
的情况:

public static Optional<Integer> add(Integer a, Integer b) {
    if (a == null || b == null)
        return Optional.empty();
    return Optional.of(a + b);
}
公共静态可选添加(整数a、整数b){
如果(a==null | | b==null)
返回可选的.empty();
返回可选。of(a+b);
}
现在,调用者有责任确定如果无法计算该值该怎么办,另外一个好处是调用者现在意识到这可能发生

如果我有一个可以传递null(非原语)的方法,但是从方法的名称来看,很明显你不能传递null,因为你不能向null添加一些东西,那该怎么办

你不能依赖这个名字。考虑

Integer add(Integer a, Integer b) {
    return a == null|| b == null ? null : a + b;
}
您可能会说,像这样的方法不会处理
null
,但是有这样的方法

java.util.Objects

public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}

如果我有一个可以传递null(非原语)的方法,但是从方法的名称来看,很明显你不能传递null,因为你不能向null添加一些东西,那该怎么办

你不能依赖这个名字。考虑

Integer add(Integer a, Integer b) {
    return a == null|| b == null ? null : a + b;
}
您可能会说,像这样的方法不会处理
null
,但是有这样的方法

java.util.Objects

public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}


最后,对于实现来说,是否有
null
-值很重要

但是在一个没有实现(或者还没有)像API一样的情况下,它们必须在整个API中与文档结合使用(例如javadoc)


顺便说一句,你的第一个问题很糟糕,因为
int
不能为null。澄清之后,这个问题就没有意义了。

最后,对于实现来说,是否有一个
null
-值很重要

但是在一个没有实现(或者还没有)像API一样的情况下,它们必须在整个API中与文档结合使用(例如javadoc)



顺便说一句,你的第一个问题很糟糕,因为
int
不能为null。澄清之后,这个问题就没有意义了。

如果有一个整数怎么办?@ÓscarLópez您的更新不适合所有情况:
整数a=null;加(i,a)
添加了一个
null
。不,我的意思是如果我将
公共静态整数添加(@NotNull Integer a,@NotNull Integer b)
?@PeterRader你测试过吗?因为事实上,它确实涵盖了这种情况。@Defozo这是另一种情况,
整数可以是
null
,在这种情况下,使用注释是合理的,尽管有点偏执。如果有整数呢?@scarLópez您的更新不适合所有情况:
整数a=null;加(i,a)
添加了一个
null
。不,我的意思是如果我将
公共静态整数添加(@NotNull Integer a,@NotNull Integer b)
?@PeterRader你测试过吗?因为事实上,它确实涵盖了这种情况。@Defozo这是另一种情况,
整数可以是
null
,在这种情况下,使用注释是合理的,尽管有点偏执。@PeterRader这个问题没问题,me对IntellijIntellij也有同样的问题,如果您在原语或
void
上使用这些注释,Jintellij会抱怨。我建议关注可能发生的问题,而不是试图解决无法解决的问题。我不确定是否应该编辑问题或保持原样,但我想问,如果我有一个可以传递null的方法(非原语),该怎么办但是从方法的名称来看,很明显,您不能传递null,因为您不能向null添加内容差不多that@Defozo我不会太依赖方法的名称。您可能有
nul