Java 为什么不让StringBuilder和StringBuffer实现一个公共接口?

Java 为什么不让StringBuilder和StringBuffer实现一个公共接口?,java,design-patterns,stringbuilder,stringbuffer,Java,Design Patterns,Stringbuilder,Stringbuffer,Java中和之间的差异已经有了很好的文档记录,并且也得到了验证 基本上,StringBuilder是StringBuffer的非同步副本,具有几乎相同的界面,因为它旨在更快地替换StringBuffer。它们的API实际上是相同的,实际上它们是当前JDK中同一个不可访问抽象类的子类 因此,我想知道的一件事是,为什么它们没有公开关联。让这两个类实现一个公共接口,或者甚至让StringBuffer作为StringBuilder的子类,都是有意义的,因为这两个类都允许存在共享代码 那么,为什么要强迫分

Java中和之间的差异已经有了很好的文档记录,并且也得到了验证

基本上,
StringBuilder
StringBuffer
的非同步副本,具有几乎相同的界面,因为它旨在更快地替换
StringBuffer
。它们的API实际上是相同的,实际上它们是当前JDK中同一个不可访问抽象类的子类

因此,我想知道的一件事是,为什么它们没有公开关联。让这两个类实现一个公共接口,或者甚至让
StringBuffer
作为
StringBuilder
的子类,都是有意义的,因为这两个类都允许存在共享代码

那么,为什么要强迫分离呢?这样程序员就不会无意中将线程安全代码与线程不安全代码混用了吗?或者这仅仅是一个设计疏忽,现在将被继承到永恒的尽头

编辑:

澄清一下:我可以推测为什么事情会是这样,但我希望具体参考实际决策,例如在JSR过程中。对我来说,任何能让我明白的事情都是一种偶尔会造成一定程度困难的情况

编辑2:

我完全忘记了这两个类都实现的事实。可能是因为这个特定的接口在大多数情况下都是无用的——它只能附加一个字符或一个准备好的对象,仅此而已。在大多数情况下,它并不比两个类都是的子类更有用

编辑3:

好的,下面是这个问题的基本原理:

图书馆小组的评价:

根据设计,StringBuffer和StringBuilder不共享任何公共资源 公共超类型。它们不打算成为替代品:一个是 错误(StringBuffer),另一个(StringBuilder)是它的 替换

显然,在某些情况下,缺少一个通用的超类型可能会减慢速度 希望从StringBuffer迁移到StringBuilder。反面 通过添加一个普通的超类型,我们将承担 过去,并将他们铭记在公共界面中,与我们永远在一起 时间这不仅减缓了迁移的速度,还使迁移脱轨


它们实际上都实现了这两个功能

我不认为这是无用的。根据我的经验,StringBuilder/StringBuffer使用的很大一部分只是处理字符串(实现
CharSequence
)。对于其余部分,可以在传入之前调用
String.valueOf

如果有另一个界面也有其他方法,比如
append(long)
,那就很方便了。但这不是必要的

有一个公共接口是合理的。它们具有不同的性能和线程特性,但JDK中的许多接口都是这样


例如,在基于数组的线程安全列表中(它为每次写入创建一个新列表),while是一个非线程安全的链表。

我没有JSR参考,但根据我的经验。以下是几个原因:

  • StringBuffer
    作为
    StringBuilder
    子类出于性能原因,不是一个好主意。要使
    StringBuffer
    线程安全,您必须屏蔽对
    StringBuilder
    的每次调用,这会带来大量开销

  • 除此之外,如果您可以直接访问类的内部,则可以进一步优化
    Java.lang.concurrent
    over
    Java.util.Collections.synchronized*
    API。因为更直接的访问提供了更多的优化选项。支持这一点

  • 进一步补充第一点,我不认为这是设计上的疏忽,因为这两个类都是final,所以他们肯定不希望这些类被子类化

  • 关于相同的接口,两个类实现相同的接口,即
    可序列化、可追加、CharSequence
    。因此,它们是替代品。唯一的问题是,它们不是实现一个公共接口,而是实现三个公共接口。这很有意义,因为不需要一个臃肿的接口,从技术上讲,它是当前接口的总和(
    可序列化、可追加、CharSequence

编辑:

  • 为了@MatthewFlaschen的观点,有一些API是相同的b/w
    StringBuffer
    StringBuilder
    ,但不在任何实现的接口中。这更多地与向后兼容性有关。您想添加一个新的api,但该接口正被许多其他类使用,因此更改接口可能不可行。这是Java人员可能已经做出的经过深思熟虑的决定。所以我不会说这是个错误
编辑2:


旁注:另一件需要注意的事情是
StringBuffer
在1.0中引入,而
StringBuilder
在1.5中引入。因此,这两个类中都有但不在接口中的API将在稍后介绍,而不是在创建这些类时介绍。

您没有回答这个问题,甚至没有给出任何关于为什么会这样的见解。@MackieChan,我不同意。我说“有一个公共接口是合理的”,这是另一种说法,“是的,这是一个设计疏忽”。老实说,我忘记了Appendeable,主要是因为我经常在代码中附加数字e.t.c。我并不觉得这个特定的接口非常有用,因为它迫使您事先将所有内容转换为字符串。更不用说现有的内容是不可变的……有一些方法,例如append(long),它们在两个类中都有,但在所有接口中都没有