【问题标题】:Getter and @NonnullGetter 和 @Nonnull
【发布时间】:2012-07-12 23:39:28
【问题描述】:

我收到来自 eclipse 的警告,我知道我可以使用抑制警告将其删除,但我更愿意了解是什么使它可能为空。

包信息.java

@ParametersAreNonnullByDefault
package test;

import javax.annotation.ParametersAreNonnullByDefault;

test.java

package test;


public class Test {
    public static void main( final String[ ] args ) {
        System.out.println( new Test( "a" ).getS( ) );
    }

    private final String s;

    public Test( final String s ) {
        this.s = s;
    }

    public String getS( ) {
        return this.s;//Null type safety: The expression of type String needs unchecked conversion to conform to '@Nonnull String'
    }
}

我不明白为什么会收到此警告...

PS:

public Test( @Nonnull final String s ) { -> nullness 注释是多余的,默认情况下适用于该位置

@Nonnull private final String s; -> 没有任何变化

【问题讨论】:

  • Javadocs 应该改进理解:(另外,要小心设置器的流畅返回值——它们是不是“合法的”JavaBean 设置器,而各种工具要么抱怨它,要么根本看不到它们。IMO 最好将 JavaBean 和 fluent 方法分开。
  • 我怎样才能提高对这么简单的代码的理解...我只是简单地描述了这些方法,因为您无法从 javadoc 页面中看到内容。
  • 通过删除多余的 Javadocs。
  • 测试包中是否也有@ParametersAreNonnullByDefault 表示法?
  • Eclipse 4.3 为字段添加了基于注释的空值分析 (bugs.eclipse.org/bugs/show_bug.cgi?id=331649)

标签: java null annotations non-nullable


【解决方案1】:

问题是@Nonnull 注解对字段没有影响。它仅支持:

  • 方法参数
  • 方法返回值
  • 局部变量(在代码块内)

See eclipse Documentation

很明显 - 由于未在字段上检查 Nonnull - 编译器不知道 Test.s 是 Nonnull 并抱怨它。

显而易见的解决方案确实是在字段访问(或方法,如果它是一个简单的 getter)上添加一个 @SuppressWarnings("null"):

public String getS() {
    @SuppressWarnings("null")
    @Nonnull String s = this.s;
    return s;
}

【讨论】:

  • 我不使用 Eclipse 的注解...我使用 javax 中的注解。我告诉过日食,但你告诉我它只是假设我改变了名字。有没有办法告诉它的行为方式不完全相同?
  • 嗯,我不确定我是否收到了您的第一条评论...您使用的注释无关紧要(只需告诉 Eclipse 完整的类名)。您也可以使用自己的库,这样就不必导入外部库。
  • 查看Eclipse bug #331649 (consider null annotations for fields) 了解当前对字段的空注释支持的状态。
猜你喜欢
  • 2019-06-29
  • 1970-01-01
  • 2015-03-06
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 2016-06-06
  • 1970-01-01
相关资源
最近更新 更多