假设我们定义这个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的内存中?
注意:这个问题与Optional
s 无关。
技术上,引用是可以为空的。即使您可以final
用来确保编译器不会留下变量null
,也可以使用反射来删除其终结性并将其设置为null。
如果您不考虑反射,那么可以说是本机代码Unsafe
或字节码检测等等。最后,内部表示形式允许空值,因此,null
如果您 确实
愿意,则可以根据您要走的距离而定,除非您对允许/可能的条件进行了限制,例如是否SecurityManager
为参与。
如果您因为担心变量不够安全而提出问题NullPointerExceptions
,则使用final
,Objects.requireNonNull()
而良好的设计就足够了。
有办法做那样的事吗?
问题内容: 是否可以在Gradle中声明一个可在Java中使用的变量?基本上,我想在build.gradle中声明一些var,然后在构建时(显然)获取它。就像C / C ++中的预处理器宏一样… 一个声明的例子就是这样: 有没有办法做这样的事情? 问题答案: 生成Java常量 你可以使用 产生Android资源 你可以使用或以通常的方式访问它们
问题内容: 是否可以在String方法中使用默认参数。代码如下所示: 上面的代码生成错误。有可能纠正吗? 问题答案: 不,您通常这样做的方法是重载这样的方法:
这个问题现有两种变体: 仅当字段不为空时验证:有条件地处理字符串的解决方案 Hibernate验证-仅在对象不为null时进行验证:唯一的答案演示了该行为,并提示您在手动触发验证时如何处理该行为 我的问题添加了限定符,即在可能为空的对象上使用@Valid时如何执行此操作。 这里的用例是,我们有两个字段,其中一个或另一个需要不为null(包含字段的类上的自定义验证器)。当一个不为null时,我需要它
例如,我知道在检查字符串时,可以执行如下操作 但是是否有一种方法来检查一个字符是否匹配一个可能性列表?或者我必须逐一检查,例如 ...等。