Java 类型之间的字符串类源行为不一致

Java 类型之间的字符串类源行为不一致,java,string,Java,String,当Java开发人员做出设计决策时,他们通常会遵循关于代码可维护性的“最佳实践”,等等。因此,我惊讶地发现字符串类源代码中存在以下情况(注释是我的,显然不是他们的) 这使我想到,出于某种原因,它可能没有在布尔类中定义,或者布尔引用字符串。同样,我惊讶地发现这种方法是重复的 /* Identical code to String */ public static String toString(boolean b) { return b ? "true" : "false"; } 现在,我

当Java开发人员做出设计决策时,他们通常会遵循关于代码可维护性的“最佳实践”,等等。因此,我惊讶地发现字符串类源代码中存在以下情况(注释是我的,显然不是他们的)

这使我想到,出于某种原因,它可能没有在布尔类中定义,或者布尔引用字符串。同样,我惊讶地发现这种方法是重复的

/* Identical code to String */
public static String toString(boolean b) {
    return b ? "true" : "false";
}
现在,我知道布尔值的规范表示很可能不会改变。但是,有多少次发送给我们的人(作为开发人员)向我们发送需求时会说“哦,这不会改变-它是一成不变的!”然而,经过一段时间后,他们回来说“我们需要这个改变,我们现在就需要它!”然后挂断电话,然后你才能告诉他们他们说它永远不会改变


他们这样做有什么特别的原因吗?我知道那句话听起来像是谋杀什么的,但仍然如此。我是唯一对此感到惊讶的人吗?

他们对典型系统需求使用的石头与对Java规范使用的石头不同。前者大多写在皂石上,后者用钻石尖的刻字机刻在刚玉上


实际上,将
Boolean.toString()
更改为返回“true”和“false”以外的内容的可能性为零。它可能会破坏数十万个Java应用程序。Sun/甲骨文不会做这样的事情。这对他们的Java业务模型来说是灾难性的。

他们对典型的系统需求使用的石头与对Java规范使用的石头不同。前者大多写在皂石上,后者用钻石尖的刻字机刻在刚玉上

实际上,将
Boolean.toString()
更改为返回“true”和“false”以外的内容的可能性为零。它可能会破坏数十万个Java应用程序。Sun/甲骨文不会做这样的事情。这对他们的Java商业模式来说是灾难性的。

“true”
“false”
是由语言本身强制规定的;因此,在这种情况下,硬编码字符串值是相对安全的

。。。将
布尔操作数
转换为
字符串
(要么
为“真”
,要么
为“假”

类似地,该语言指定,例如,
null
引用在字符串转换期间变为
“null”

如果引用为
null
,则将其转换为字符串
“null”
(四个ASCII字符n、u、l、l)

一般来说,最好不要在整个代码库中硬编码常量,但是当语言保证常量应该是什么时,问题就不那么严重了


以下是OpenJDK的一个片段:

请注意,
StringBuilder扩展了AbstractStringBuilder

“true”
“false”
由语言本身强制执行;因此,在这种情况下,硬编码字符串值是相对安全的

。。。将
布尔操作数
转换为
字符串
(要么
为“真”
,要么
为“假”

类似地,该语言指定,例如,
null
引用在字符串转换期间变为
“null”

如果引用为
null
,则将其转换为字符串
“null”
(四个ASCII字符n、u、l、l)

一般来说,最好不要在整个代码库中硬编码常量,但是当语言保证常量应该是什么时,问题就不那么严重了


以下是OpenJDK的一个片段:


请注意,
StringBuilder扩展了AbstractStringBuilder

有趣的是,感谢您提供的文档链接。同样有趣的是,规范中拼写为null,但不是真的和假的。这并不奇怪。true和false都在别处定义(null也是)。没有必要在那一段中明确地提到true和false,而明确地提到null是必要的。有趣的是,感谢您提供了记录它的链接。同样有趣的是,规范中拼写为null,但不是真的和假的。这并不奇怪。true和false都在别处定义(null也是)。在那一段中没有必要明确提到true和false,而明确提到null是必要的。
/* Identical code to String */
public static String toString(boolean b) {
    return b ? "true" : "false";
}
public AbstractStringBuilder append(boolean b) {
    if (b) {
        ensureCapacityInternal(count + 4);
        value[count++] = 't';
        value[count++] = 'r';
        value[count++] = 'u';
        value[count++] = 'e';
    } else {
        ensureCapacityInternal(count + 5);
        value[count++] = 'f';
        value[count++] = 'a';
        value[count++] = 'l';
        value[count++] = 's';
        value[count++] = 'e';
    }
    return this;
}