JavaStringBuilder
との違いは十分に文書化されており、StackOverflowでも触れられています。StringBuffer
基本的に、StringBuilder
はの非同期コピーでありStringBuffer
、のより高速なドロップイン置換として意図されていたため、ほとんど同じインターフェイスを備えていますStringBuffer
。それらのAPIは実質的に同一であり、実際には現在のJDKの同じアクセスできない抽象クラスのサブクラスです。
したがって、私が疑問に思うことの1つは、なぜそれらが公に関連していないのかということです。両方のクラスに共通のインターフェースを実装させるかStringBuffer
、のサブクラスとして持つStringBuilder
ことは理にかなっており、両方のクラスの共有コードの存在を可能にします。
では、なぜこの強制分離なのか?プログラマーが誤ってスレッドセーフなコードとスレッドセーフでないコードを混同しないようにするためでしたか?それとも、今や永遠の終わりまで受け継がれるのは、単なる設計の見落としだったのでしょうか。
編集:
明確にするために:私は物事がこのようなものである理由を推測することができますが、たとえばJSRプロセス中など、実際の決定への具体的な参照を望んでいます。私にとって、何が何かに光を当てるであろうものは、時々ある程度の困難を引き起こす状況です。
編集2:
両方のクラスが実装されているという事実はAppendable
、私の心を完全に滑らせました。おそらく、その特定のインターフェイスはほとんどの目的で役に立たないためです。追加できるのは1つの文字または準備されたオブジェクトのみであり、それだけです。ほとんどの場合、両方のクラスがのサブクラスであるよりも便利ではありませんObject
。
編集3:
さて、これが半公式の情報源からのまさにこの質問の理論的根拠です:
図書館チームによる評価:
StringBufferとStringBuilderが共通のパブリックスーパータイプを共有しないのは設計によるものです。それらは代替を意図したものではありません。1つは間違い(StringBuffer)であり、もう1つ(StringBuilder)はその置き換えです。
明らかに、一般的なスーパータイプがないため、場合によっては、StringBufferからStringBuilderへの期待される移行が遅くなる可能性があります。反対に、共通のスーパータイプを追加することで、過去のエラーを取得し、パブリックインターフェイスにそれらを祀って常に一緒にいることになります。これは単に移行を遅らせるだけでなく、移行を狂わせます。