是否在Java中使用boolean实习?

时间:2016-06-19 08:58:56

标签: java jls

Integer的以下代码使用对象实习:

Integer.valueOf("1")

从API文档中不清楚Boolean的此代码是否也使用了interned对象:

Boolean.valueOf("true")

显然,它可能。但它必须吗?

更新

我同意源代码可以解释实际发生的事情(BTW,感谢答案)。为了使问题不那么简单,Java API规范或JSL的任何部分是否告诉必须发生什么?

对这样的代码提问是很自然的:

String str = "true";
if (Boolean.valueOf(str) == Boolean.TRUE) { ... }

结果取决于“对象实习”是否得到保证。最好完全避免使用此代码并使用true代替Boolean.TRUE(而不是查找任何规范或来源中的详细信息),但这是提出问题的正当理由。

注意:事实上,我没有看到任何Google搜索规范中Integer的对象实习保证。所以,它可能只是一个没人应该依赖的实现细节。

3 个答案:

答案 0 :(得分:5)

基于source code,布尔值被解析为:

public static final Boolean FALSE = new Boolean(false);
public static final Boolean TRUE = new Boolean(true);

public static Boolean valueOf(String s) {
    return toBoolean(s) ? TRUE : FALSE;
}

TRUEFALSE是静态(不可变)对象。所以是的,已解析的布尔值被实习。

但是,我同意@JBNizet's comment不应该从源代码中获取代码契约:只要没有记录功能,Java的开发人员就可以改变主意。最好使用Boolean.equals来检查两个对象是否相同。

答案 1 :(得分:5)

JLS保证:

Integer i = 1;
Boolean b = true;

将使用实习(至少在-128和127之间用于整数,对于布尔运算用于真和假)。

相关的javadoc还保证:

Integer i = Integer.valueOf(1);
Boolean b = Boolean.valueOf(true);

将返回实习对象。

然而,valueOf(String)没有明确的保证:虽然在您使用的具体实现中就是这种情况,但在不同的JVM或将来的版本中可能不是这种情况。实际上,return new Boolean(Boolean.parseBoolean(input))将是有效的实现。

答案 2 :(得分:2)

这里是source code

public static final Boolean TRUE = new Boolean(true);

TRUE的位置:

Boolean a = Boolean.valueOf("true");
Boolean b = Boolean.valueOf("true");

如果您仍然不确定,请定义两个变量:

{{1}}

并自行检查你想要的任何东西。