在Java中,是否可以声明一个永远不能为null的字段?
假设我们定义这个Book类,以确保不能向isbn分配空值:
public class Book { private String isbn;
public Book(String isbn) {
setIsbn(isbn);
}
public void setIsbn(String isbn) {
if (isbn == null) {
throw new NullPointerException();
}
this.isbn = isbn;
}
public String getIsbn() {
return this.isbn;
}
}
这样可以防止创建isbn为null的Book对象,但是在创建具有非null isbn的book对象之后,我们可以通过反射修改值并将其设置为null。
无论如何(使用技巧或Java功能)是否可以防止Book实例存在于isbn为null的内存中?
注意:这个问题与Optional
s 无关。
回答:
技术上,引用是可以为空的。即使您可以final
用来确保编译器不会留下变量null
,也可以使用反射来删除其终结性并将其设置为null。
如果您不考虑反射,那么可以说是本机代码Unsafe
或字节码检测等等。最后,内部表示形式允许空值,因此,null
如果您
愿意,则可以根据您要走的距离而定,除非您对允许/可能的条件进行了限制,例如是否SecurityManager
为参与。
如果您因为担心变量不够安全而提出问题NullPointerExceptions
,则使用final
,Objects.requireNonNull()
而良好的设计就足够了。
以上是 在Java中,是否可以声明一个永远不能为null的字段? 的全部内容, 来源链接: utcz.com/qa/397408.html