Java @参数的Getter和Setter上的NotNull蕴涵

Java @参数的Getter和Setter上的NotNull蕴涵,java,getter-setter,notnull,Java,Getter Setter,Notnull,相信并使用,我有一个类,它的某些字段标记为@NotNull[package javax.validation.constraints]以传递给客户端。该类还实现了此类字段的默认getter和setter。样本类别如下- public class MyClass { public MyClass() { } @NotNull private String name; private Boolean bool; public String ge

相信并使用,我有一个类,它的某些字段标记为
@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
检查是否多余,(如果不是)好奇地想知道为什么

另外,如果它是冗余的,我想考虑设置一个null值并获取param的值。尝试一下,因为-

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

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

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

但是,如果您引入更多类似这样的注释:

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

@NonNull
public String getName() {
    return name;
}
现在工具应该指示
newmyclass().getName()!=空
始终为真。它还在
setName
中警告您正在将可为null的值设置为非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;
}

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

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

但是,如果您引入更多类似这样的注释:

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

@NonNull
public String getName() {
    return name;
}
现在工具应该指示
newmyclass().getName()!=空
始终为真。它还在
setName
中警告您正在将可为null的值设置为非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;
}