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