为什么stringbuffer最终?

Abh*_*h28 3 java

字符串类是不可变的,其背后的原因之一是该类被声明为final,尽管还有其他原因.但是为什么StringBuffer或StringBuilder最终仍然是可变的?那么还有哪些因素决定String是不可变的?

Hol*_*ger 5

StringBuffer并且StringBuilder主要用于单个方法中的字符串连接操作,使用它们的代码通常由编译器生成.因此,扩展不是典型的用例.

另一方面,final允许在JVM中进行更好的优化,至少在过去是这样; 今天的HotSpot JVM不需要它,但是,从来没有理由改变final这些类的声明.

请注意,StringBuilder多态行为的扩展和重写方法将毫无意义,因为public整个JRE接受或返回StringBuilder实例中没有方法(除了内部StringBuilder).有AppendableCharSequence填补这一空白,并提供更大的灵活性.

的概念可变性不变性是从的概念完全不同的final类.它们只取决于一个类提供的方法或操作.String没有允许修改其内容的方法,StringBuffer并且StringBuilder有这样的方法.声明一个不可变类final只是有助于禁止可能引入支持变异的方法的子类,但这不是一个硬性要求.

  • @AgentM 所有 `StringBuilder` 的 `append` 方法都已声明为返回 `StringBuilder` 而不是您假设的子类。因此,当使用继承的“append”方法时,“yourBuilder.append(x).appendLn(y)”将不起作用,因为在第一次调用(继承的)“append”方法后,编译器会抱怨“StringBuilder” ` 没有你的新方法。除非您重写所有这些方法以返回更具体的类型,即您的子类。但是,当您无论如何都必须重写所有方法时,扩展并不比委托更容易。 (2认同)