创建 AbstractStringBuilder 和 StringBuilder 有什么意义?

What is the point of creating both AbstractStringBuilder and StringBuilder?

为什么 Java 开发人员没有创建 class、AbstractStringBuilder 并将其重命名为 StringBuilder

例如AbstractStringBuilder中的方法:

public AbstractStringBuilder append(double d) {
    FloatingDecimal.appendTo(d,this);
    return this;
}

StringBuilder中的方法:

@Override
public StringBuilder append(double d) {
    super.append(d);
    return this;
}

我想我们可以在 AbstractStringBuilder 中只保留一种方法,而且它会正常工作。创建无用的包装器有什么意义 StringBuilder

由于 AbstractStringBuilder 不是 public class,如果不问开发人员为什么要写它,只能推测...

推测

请注意 StringBuffer,

A thread-safe, mutable sequence of characters.

是在 1.0 中添加的。 StringBuilder 的 Javadoc 读取

A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization. This class is designed for use as a drop-in replacement for StringBuffer in places where the string buffer was being used by a single thread (as is generally the case). Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.

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

我在方法 append(String) 中找到了一个简单的示例。在StringBuilder中是

@Override
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

StringBuffer中是

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

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

我们看到 thread-safe 和非 thread-safe 版本之间的唯一区别是一些缓存控制 (toStringCache),但它们都在其 super 中调用相同的方法class,因此通过继承重用代码。

类比

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

询问

What's the point of creating the useless wrapper StringBuilder?

会和有人问你一样

What's the point of creating the useless wrapper Cat?