Java中的StringBuilder
和StringBuffer
之间的差异已有详细记录,并且也是touched upon in StackOverflow。为什么不让StringBuilder和StringBuffer实现一个通用接口?
基本上,StringBuilder
是StringBuffer
的非同步副本,它具有几乎相同的接口,因为它旨在作为StringBuffer
的更快捷的替代替代方案。他们的API实际上是相同的,他们实际上是在当前JDK中抽象类相同的不可访问的的子类。
我想知道的一件事就是为什么他们不是公开相关。让这两个类实现一个通用接口,或者甚至将StringBuffer
作为StringBuilder
的子类是合理的,从而允许两个类都存在共享代码。
那么为什么这个强制分离呢?这是否让程序员不会无意中将线程安全和线程不安全的代码混合在一起?还是仅仅是一种设计监督,现在会被遗传到永恒的尽头?
编辑:
为了把事情说清楚:我可以为什么事情都是这样猜测,但我希望能具体引用到实际的决策,例如在JSR过程中。任何能够说明对我而言是什么的情况都会偶尔造成一定的困难。
编辑2:
两个类都实现Appendable
事实完全忘了。可能是因为该特定界面在大多数情况下都没有用处 - 它只能追加一个字符或一个准备好的对象,就是这样。在大多数情况下,这两个类都不是Object
的子类。
编辑3:
嗯,这里是正是这个问题从a semi-official source的理由:由图书馆团队
评价:
它是由设计的StringBuffer和StringBuilder的没有共同的 公共超类型。他们不打算成为替代品:一个是 错误(StringBuffer),另一个(StringBuilder)是其替代品 。
很明显,在某些情况下,缺少常见的超类型会减缓从StringBuffer到StringBuilder的希望迁移。另一方面 就是通过添加一个常见的超类型,我们会将过去的错误记录下来,并将它们放入一个公共接口中,以便与我们联系所有的 时间。这不仅会减缓迁移速度,而且会导致迁移。
有一些方法,例如附加(长)在两个类中,但没有接口。 – 2012-03-19 03:45:37
虽然我想像Vector和ArrayList扩展AbstractList,但StringBuffer和StringBuilder可以扩展一个类似的抽象类。我没有看到最新的源代码,但StringBuilder似乎是一个直接的StringBuffer减去同步。 – 2012-03-19 03:48:27
@MatthewFlaschen append()来自Appendable。 – 2012-03-19 03:49:42