创建AbstractStringBuilder和StringBuilder有什么意义?

时间:2015-05-04 21:12:04

标签: java stringbuilder

为什么Java开发人员没有创建一个类$this->get('your_service')->callMeTheWayYouWant($vendorId, $vendor); 并将其重命名为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有什么意义?

1 个答案:

答案 0 :(得分:4)

由于AbstractStringBuilder不是public class,因此没有问开发人员为什么写它,人们只能猜测...

<强>投机

请注意StringBuffer

  

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

在1.0中添加。 StringBuilder的Javadoc读取

  

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

(强调我的)并在1.5中添加。我们的想法是,在大多数情况下,这个类是对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;
}

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

<强>类比

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

  

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

与有人问你一样

  

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