字符串类是不可变的,其背后的原因之一是该类被声明为final,尽管还有其他原因.但是为什么StringBuffer或StringBuilder最终仍然是可变的?那么还有哪些因素决定String是不可变的?
StringBuffer并且StringBuilder主要用于单个方法中的字符串连接操作,使用它们的代码通常由编译器生成.因此,扩展不是典型的用例.
另一方面,final允许在JVM中进行更好的优化,至少在过去是这样; 今天的HotSpot JVM不需要它,但是,从来没有理由改变final这些类的声明.
请注意,StringBuilder多态行为的扩展和重写方法将毫无意义,因为public整个JRE接受或返回StringBuilder实例中没有方法(除了内部StringBuilder).有Appendable和CharSequence填补这一空白,并提供更大的灵活性.
的概念可变性和不变性是从的概念完全不同的final类.它们只取决于一个类提供的方法或操作.String没有允许修改其内容的方法,StringBuffer并且StringBuilder有这样的方法.声明一个不可变类final只是有助于禁止可能引入支持变异的方法的子类,但这不是一个硬性要求.