当前位置: 首页 > 面试题库 >

在Java中,是否可以声明一个永远不能为null的字段?

钱渊
2023-03-14
问题内容

假设我们定义这个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()而良好的设计就足够了。



 类似资料: