@NotNull对参数的Getter和Setter的影响

时间:2016-10-14 15:07:29

标签: java getter-setter notnull

相信并使用Which @NotNull Java annotation should I use?,我有一个类,其中标有@NotNull [package javax.validation.constraints]的某些字段会传递给客户。该类还为这些字段实现默认的getter和setter。下面的示例课程 -

public class MyClass 
{
    public MyClass() {
    }

    @NotNull
    private String name;

    private Boolean bool;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Boolean isBool() {
        return bool;
    }

    public void setBool(Boolean bool) {
        this.bool = bool;
    }
}

我对业务逻辑中的getter的使用留下了一点困惑 -

if(new MyClass().getName() !=null) {
    //do something
}
  

null检查不是多余的,(如果不是)好奇地知道为什么

另外如果它是多余的,想要设想一个空值并获得param的值。试试这个 -

void test() {
    myClass.setName(null);
    if (myClass.getName() == null) {
        System.out.println("It should not be null"); // this got printed
    }
}

1 个答案:

答案 0 :(得分:4)

@NonNull只是您工具的提示,它不会影响java语言本身处理空值的方式。它还要求对每个交互进行适当的注释,以确保找到所有错误。

在您的情况下会发生这种情况,而name字段会注释与该字段交互的方法不会,因此工具无法对这些方法及其可为空性做出任何假设。

但是,如果你引入更多这样的注释:

public void setName(@Nullable String name) {
    this.name = name; // should now have a warning
}

@NonNull
public String getName() {
    return name;
}

现在,工具应始终指出new MyClass().getName() != null为真。它还在setName中警告您正在为非null属性设置可为空的值,这可能是错误的。

修复的方式:

public void setName(@NonNull String name) {
    // setName(null) would cause a warning
    // Also add an exception if the annotation is ignored.
    this.name = Objects.requireNonNull(name);
}

/* or */

public void setName(@Nullable String name) {
    if (name == null) return; // Guard against setting null
    this.name = name;
}