javax.annotation.Nonnull VS断言(javax.annotation.Non

2019-08-16 21:33发布

我使用的方法参数FindBugs的和javax.annotation.Nonnull。

在私有方法我通常添加断言线检查NULL的含量一样

private void myMethod(@Nonnull String str) {
    assert str != null
    ....

最近的NetBeans版本(7.3rc2)报道称,断言检查是没有必要的(因为非空注释)。 我不能完全肯定这是一个NetBeans错误与否。

可因为我指定的@Nonnull注释断言线被删除?

据我了解,注释是静态分析中仅使用,而断言是,启用时,在执行过程中有效,因此在三三两两不是替代。

Answer 1:

断言在运行时计算,注释有助于FindBugs的运行时之前在分析过程中发现问题。 由于这两种检查都没有真正发生冲突,你可以让他们两个。 我会觉得很烦,如果我的IDE叫我删除断言。



Answer 2:

NetBeans是正确的。 如果你认为它可以为null:去掉注释。 如果你知道它不能处理:去除断言。

如果有任何机会,你的方法可以用null值调用,然后@Nonnull注释不应该在那里。

就像你说的,那注释实际上并不在运行时做任何事情:它仅用于IDE和静态代码分析工具。 它并不能保证事情不为空。



Answer 3:

由于这是私人的方法,我们可以确保注释参数不能为空。 我想你可以删除这一说法。

如果NetBeans的警告公众的方法,我觉得它有问题。 我建议你把断言。

如果你还是觉得在私有方法断言是必要的,我想你可以使用字节码注入。 举例来说,这里是一个Maven插件注入空检查。 很抱歉,这是我的个人项目,但它的作品给我。 我想这能满足您的需要。 https://github.com/KengoTODA/jsr305-maven-plugin



Answer 4:

我发现了一个不同的解决方案,因为我在想我的IDE警告。

起初,我觉得IDE是错误的。 我是一个偏执的程序员,并希望有文档与静态分析的情况下,运行时检查我曾经使用过的反射,或其他JVM语言或东西是不是静态分析的标签,所以我认为这是错误的给我一个警告,告诉我assert(x != null)并不需要声明。

但转念一想如何断言可以根据状态来去除-ea传递到Java运行时的标志,而且在某些方面assert@Nonnull真的都只有发展-检查。

原来,有一个实际的运行时检查可插入(Java 7+) Objects.requireNonNull这将抛出一个NullPointerException ,并且不能与被删除-ea断言。 我想我会喜欢这个我assert(x != null); use(x); assert(x != null); use(x); 图案。

public ConstructorForClass(@Nonnull Type x) {
  this.x = Objects.requireNonNull(x);
  //...
}


文章来源: javax.annotation.Nonnull vs assert