Java Getter和@Nonnull

Java Getter和@Nonnull,java,null,annotations,non-nullable,Java,Null,Annotations,Non Nullable,我从eclipse中得到了一个警告,我知道我可以使用suppress warning将其删除,但我更愿意理解是什么使得它可以为null package-info.java @ParametersAreNonnullByDefault package test; import javax.annotation.ParametersAreNonnullByDefault; test.java package test; public class Test { public stati

我从eclipse中得到了一个警告,我知道我可以使用suppress warning将其删除,但我更愿意理解是什么使得它可以为null

package-info.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'
    }
}
我不明白为什么我会收到这个警告

附言:

public Test(@Nonnull final String s){
->空值注释与应用于此位置的默认值是冗余的


@Nonnull private final String s;
->没有任何更改

问题是@Nonnull注释对字段没有影响。它仅在以下情况下受支持:

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

所以很明显,由于字段上没有检查Nonnull,编译器不知道Test.s是Nonnull并对此进行抱怨。 显而易见的解决方案确实是在字段访问上添加@SuppressWarnings(“null”)(或者在方法上,如果它是一个简单的getter):


Javadoc应该能够提高理解能力:(另外,要警惕设置程序的流畅返回值——它们不“合法”JavaBean setter和各种工具可能会对此抱怨,甚至看不到它们。在我看来,最好将JavaBean和fluent方法分开。我如何才能提高对这么简单的代码的理解……我只是简单地描述了这些方法,因为你看不到javadoc页面上的内容。通过删除多余的javadoc。你没有吗测试包中的@ParametersAreNonnullByDefault表示法也是如此?Eclipse4.3为字段()添加了基于注释的空值分析我不使用Eclipse的注释…我使用的是来自javax的注释。我告诉过Eclipse,但你告诉我它只是假设我更改了名称。有没有办法告诉我它的行为不完全相同?嗯,我不确定我是否收到了你的第一条注释…你使用的注释是无关的(只需告诉Eclipse完整的类名)。您也可以使用自己的库,这样就不必导入外部库。有关字段的null批注支持的当前状态,请参阅。
public String getS() {
    @SuppressWarnings("null")
    @Nonnull String s = this.s;
    return s;
}