在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的内存中?

注意:这个问题与Optionals 无关。

回答:

技术上,引用是可以为空的。即使您可以final用来确保编译器不会留下变量null,也可以使用反射来删除其终结性并将其设置为null。

如果您不考虑反射,那么可以说是本机代码Unsafe或字节码检测等等。最后,内部表示形式允许空值,因此,null如果您

愿意,则可以根据您要走的距离而定,除非您对允许/可能的条件进行了限制,例如是否SecurityManager为参与。

如果您因为担心变量不够安全而提出问题NullPointerExceptions,则使用finalObjects.requireNonNull()而良好的设计就足够了。

以上是 在Java中,是否可以声明一个永远不能为null的字段? 的全部内容, 来源链接: utcz.com/qa/397408.html

回到顶部