【发布时间】:2020-06-02 18:01:56
【问题描述】:
假设我们定义了这个 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 无关。
【问题讨论】:
-
另一个关门了,这个还活着。
-
只需将其设为
final,并在构造函数中指定this.isbn = Objects.requireNonNull(isbn)。编辑:从头开始,错过反射是一种选择 -
如果您使用的是 Kotlin,这会容易得多。我想用
@NotNull警告其他人是你能得到的最接近的(没有制作编译器插件) -
不在兼容的 JVM 中。引用可以为空。
-
由于您的类不可序列化,因此使该字段为空的唯一方法是通过反射。您可以使用
SecurityManager防止这种情况发生。例如,扩展 SecurityManager 类,您可以在应用程序级别使用反射来拒绝