以下代码用于Integer使用对象实习:
Integer.valueOf("1")
Run Code Online (Sandbox Code Playgroud)
从API文档中不清楚此代码是否Boolean也使用了interned对象:
Boolean.valueOf("true")
Run Code Online (Sandbox Code Playgroud)
显然,它可能.但是它必须吗?
UPDATE
我同意源代码可以解释实际发生的事情(BTW,感谢答案).为了使问题变得不那么简单,Java API规范或JSL的任何部分是否告诉必须发生什么?
对这样的代码提出问题是很自然的:
String str = "true";
if (Boolean.valueOf(str) == Boolean.TRUE) { ... }
Run Code Online (Sandbox Code Playgroud)
结果取决于"对象实习"是否得到保证.最好完全避免使用这些代码true而不是Boolean.TRUE(而不是查找任何规范或来源中的详细信息),但这是提出问题的正当理由.
注意:事实上,我没有看到Integer任何Google搜索规范中对象实习的保证.所以,它可能只是一个没人应该依赖的实现细节.
根据源代码,boolean被解析为:
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;
}
Run Code Online (Sandbox Code Playgroud)
其中TRUE和FALSE是静态的(immutable)的对象.所以是的,已解析的布尔值被实习.
但是,我同意@ JBNizet的观点,即不应该从源代码中获取代码契约:只要没有记录功能,Java的开发人员就可以改变主意.最好Boolean.equals用来检查两个对象是否相同.
在JLS保证:
Integer i = 1;
Boolean b = true;
Run Code Online (Sandbox Code Playgroud)
将使用实习(至少在-128和127之间用于整数,对于真和假用于布尔运算).
相关的javadoc还保证:
Integer i = Integer.valueOf(1);
Boolean b = Boolean.valueOf(true);
Run Code Online (Sandbox Code Playgroud)
将返回实习对象.
但是,没有明确的保证valueOf(String):虽然在您使用的特定实现中就是这种情况,但在不同的JVM或将来的版本中可能不是这种情况.实际上是一个return new Boolean(Boolean.parseBoolean(input))有效的实现.