(出于这个问题的目的,让我们假设有人故意不使用auto(un)boxing,因为有人正在编写Java 1.5之前的代码,或者因为有人认为autounboxing使得创建NullPointerException太容易了。)

Boolean为例。 Boolean(boolean)构造函数的文档说:



我的问题是,您为什么首先要获得一个新实例?如果像这样的构造函数是私有(private)的,事情似乎会更简单。例如,如果是这样,则可以毫无危险地编写此代码(即使myBooleannull):

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/

10-11 22:25
查看更多