java - 在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 为空的内存中?
注意:这个问题与Optional
s 无关。
解决方案
技术上的引用是可以为空的。即使您可以使用final
来确保编译器不会让您留下变量null
,您也可以使用反射来删除它的最终确定性并将其设置为 null。
如果您不考虑反射,那么我们可以说本机代码Unsafe
或字节码检测等等。最后,内部表示允许空值,因此取决于您将走多远,null
如果您真的想要,将有一种方法来制作变量,除非您指定关于允许/可能的限制,例如是否SecurityManager
a涉及。
如果你问这个问题是因为你害怕你的变量对 来说不够安全NullPointerExceptions
,那么使用final
,Objects.requireNonNull()
和好的设计就足够了。
推荐阅读
- php - PHP get方法奇怪地工作我不知道如何解决
- aerospike - Aerospike 扫描性能
- python-3.x - 无法使用python发送邮件
- android - 系统应用权限问题
- python - 如何将颜色图添加到 matplotlib 动画?
- javascript - 浏览器中的视频元素使音乐应用静音
- swift - 'PKAddressField' 已弃用:首先在 iOS 11.0 中弃用 - 使用 PKContactField 和 -requiredShippingContactFields / -requiredBillingContactFields
- bash - 优化 bash 中包含多个元素的 if 语句?
- swift - 如何通过镜像更改变量的值?
- arrays - 使用递归重写 Ruby #inject (#reduce)?