首页 > 解决方案 > 在Java中,是否可以声明一个永远不会为空的字段?

问题描述

假设我们定义了这个 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 为空的内存中?

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

标签: javanull

解决方案


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

如果您不考虑反射,那么我们可以说本机代码Unsafe或字节码检测等等。最后,内部表示允许空值,因此取决于您将走多远,null如果您真的想要,将有一种方法来制作变量,除非您指定关于允许/可能的限制,例如是否SecurityManagera涉及。

如果你问这个问题是因为你害怕你的变量对 来说不够安全NullPointerExceptions,那么使用final,Objects.requireNonNull()和好的设计就足够了。


推荐阅读