同时创建AbstractStringBuilder和StringBuilder有什么意义?

Dmi*_*405 3 java stringbuilder

Java开发人员为什么不创建一个类AbstractStringBuilder并将其重命名为StringBuilder

例如,以下方法AbstractStringBuilder

public AbstractStringBuilder append(double d) {
    FloatingDecimal.appendTo(d,this);
    return this;
}
Run Code Online (Sandbox Code Playgroud)

和中的方法StringBuilder

@Override
public StringBuilder append(double d) {
    super.append(d);
    return this;
}
Run Code Online (Sandbox Code Playgroud)

我想我们只能保留一种方法AbstractStringBuilder,它将很好地工作。创建无用包装的目的是StringBuilder什么?

use*_*551 5

既然AbstractStringBuilder不是public class,就不问开发人员为什么要编写它了,所以只能推测...

投机

请注意StringBuffer

线程安全的可变字符序列。

在1.0中添加。StringBuilder的Javadoc读取

可变的字符序列。此类提供了与兼容的API StringBuffer,但不保证同步。此类设计为在StringBuffer单线程正在使用字符串缓冲区的位置(通常是这种情况)中使用的替代产品。在可能的情况下,建议优先使用此类,StringBuffer因为在大多数实现中它将更快。

(强调我的)并添加到1.5中。这个想法是,StringBuffer在大多数情况下该类是一个改进,但是总体上在功能上非常相似(可以相互替换)。正如@immibis和@MadProgrammer在评论中指出的那样,在您想要类似功能的情况下,继承的思想为您节省了很多麻烦。

我在)中找到了一个简单的例子append(String。在中StringBuilder,它是

@Override
public StringBuilder append(String str) {
    super.append(str);
    return this;
}
Run Code Online (Sandbox Code Playgroud)

StringBuffer里面

@Override
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}
Run Code Online (Sandbox Code Playgroud)

AbstractStringBuilder里面

public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}
Run Code Online (Sandbox Code Playgroud)

我们看到的是,线程安全版本和非线程安全版本之间的唯一区别是某些缓存控件(toStringCache),但是它们都在其超类中调用了相同的方法,因此通过继承重用了代码。

比喻

认为它就像您是一个编写代码的人。您将创建一个类dog,其中包括狗的解剖结构(耳朵,尾巴,4条腿...)以及与其行为相关的方法,例如bark。5年后,您要创建一个cat代表猫的类。你会从头开始吗?不,您将abstract class FourLeggedAnimal使用耳朵,尾巴,4条腿等的结构以及方法创建一个makeSound。然后,您将扩展该类并在两个子类中使用所有这些相似之处,并在必要时(barkmeow)覆盖。

询问

创建无用的包装器StringBuilder有什么意义?

会和有人问你的一样

创建无用的包装猫有什么意义?