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

时间:2011-02-21 05:35:03

标签: java string

当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";
}

现在,我知道布尔值的规范表示很可能不会改变。但是有多少次发送给我们的人(作为开发人员)向我们发送要求说“哦,这不会改变 - 它就是一成不变的!”然而,经过一段时间后,他们回来说“我们需要这种改变,现在我们需要它!”并且在你告诉他们他们说它永远不会改变之前挂断电话。

他们有什么特别的理由会这样做吗?我知道这句话听起来像是谋杀或其他什么,但仍然。我是唯一一个对此感到惊讶的人吗?

2 个答案:

答案 0 :(得分:3)

他们使用不同类型的石头来满足典型的系统要求,而不是用于Java规范。前者大多是用皂石写的,后者是用钻石笔划刻在刚玉上的。

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

答案 1 :(得分:3)

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

  

JLS 4.2.5 The boolean Type and boolean 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