(出于这个问题的目的,让我们假设有人故意不使用auto(un)boxing,因为有人正在编写Java 1.5之前的代码,或者因为有人认为autounboxing使得创建NullPointerException
太容易了。)
以Boolean
为例。 Boolean(boolean)
构造函数的文档说:
我的问题是,您为什么首先要获得一个新实例?如果像这样的构造函数是私有(private)的,事情似乎会更简单。例如,如果是这样,则可以毫无危险地编写此代码(即使myBoolean
是null
):
if (myBoolean == Boolean.TRUE)
这是安全的,因为所有正确的
Booleans
都是对Boolean.TRUE
的引用,而所有错误的Booleans
都是对Boolean.FALSE
的引用。但是因为构造函数是公共(public)的,所以可能有人使用了它们,这意味着您必须编写以下代码:if (Boolean.TRUE.equals(myBoolean))
但是真正糟糕的是您想检查两个
Booleans
的相等性。像这样的东西:if (myBooleanA == myBooleanB)
...变成这样:
if (
myBooleanA == myBooleanB ||
(myBooleanA != null && myBooleanA.equals(myBooleanB))
)
更新:随着Java 7的发布,java.util.Objects使这种更简单的构造成为可能:
if (Objects.equals(myBooleanA, myBooleanB))
我想不出有任何理由要拥有这些对象的单独实例,这比不必做上面的废话更引人注目。你说什么
最佳答案
缓存的值永远不会被垃圾收集,因此,只要您想将其用作软/弱引用,就可以使用构造函数,以便无论何时需要都可以对其进行垃圾收集。这同样适用于Long#valueOf()
,Integer#valueOf()
和具有可缓存范围内的值的组合。
在Eclipse中进行引用搜索后,我了解到,在每个java.lang.Thread
下都使用new Boolean()
作为基于软引用的缓存,甚至对其进行了显式注释(在isCCLOverridden()
方法中):
/*
* Note: only new Boolean instances (i.e., not Boolean.TRUE or
* Boolean.FALSE) must be used as cache values, otherwise cache
* entry will pin associated class.
*/
关于java - 为什么要在 boolean 和类似的不可变类上使用公共(public)构造函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2601857/