当Java开发人员做出设计决策时,他们通常遵循关于代码可维护性的“最佳实践”,而不是。所以我很惊讶在String类源代码中找到了以下情况(评论是我的,显然不是他们的。)
/* Makes sense, use the appropriate class for this */
public static String valueOf(int i) {
return Integer.toString(i, 10);
}
/* Makes sense, use the appropriate class for this too */
public static String valueOf(float f) {
return Float.toString(f);
}
/* Magic values "true" and "false"? Seriously? */
public static String valueOf(boolean b) {
return b ? "true" : "false";
}
这让我觉得由于某些原因它可能没有在Boolean类中定义,或者布尔引用String。再次,我很惊讶地发现这种方法是重复的。
/* Identical code to String */
public static String toString(boolean b) {
return b ? "true" : "false";
}
现在,我知道布尔值的规范表示很可能不会改变。但是有多少次发送给我们的人(作为开发人员)向我们发送要求说“哦,这不会改变 - 它就是一成不变的!”然而,经过一段时间后,他们回来说“我们需要这种改变,现在我们需要它!”并且在你告诉他们他们说它永远不会改变之前挂断电话。
他们有什么特别的理由会这样做吗?我知道这句话听起来像是谋杀或其他什么,但仍然。我是唯一一个对此感到惊讶的人吗?
答案 0 :(得分:3)
他们使用不同类型的石头来满足典型的系统要求,而不是用于Java规范。前者大多是用皂石写的,后者是用钻石笔划刻在刚玉上的。
实际上,有{0}的机会将Boolean.toString()
更改为返回“true”和“false”以外的内容。它可能会破坏数十万个Java应用程序。 Sun / Oracle不会做那样的事情。对他们的Java商业模式来说,这将是一场灾难。
答案 1 :(得分:3)
"true"
和"false"
由语言本身强制执行;因此,在这种情况下,对字符串值进行硬编码是相对安全的。
JLS 4.2.5 The
boolean
Type andboolean
Values...会将
boolean
操作数转换为String
("true"
或"false"
)...
类似地,该语言指定例如在字符串转换过程中,null
引用变为"null"
。
JLS 15.18.1.1 String Conversion
如果引用为
null
,则将其转换为字符串"null"
(四个ASCII字符n,u,l,l)
通常最好不要在整个代码库中对常量进行硬编码,但是当语言保证常量应该是什么时,这就不再是问题了。
以下是OpenJDK对AbstractStringBuilder
的一个片段:
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;
}
请注意StringBuilder extends AbstractStringBuilder
。