相信并使用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
}
}
答案 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;
}