JavaのStringBuilder
とStringBuffer
の違いについては十分に文書化されており、touched upon in StackOverflowもあります。StringBuilderとStringBufferに共通のインタフェースを実装させるのはなぜですか?
基本的には、StringBuilder
は、それがStringBuffer
ためのより高速なドロップイン置換として意図されていたので、ほとんど同じインターフェースで、StringBuffer
の非同期コピーです。それらのAPIは実質的に同一であり、実際には同じのサブクラスであり、現在のJDKの抽象クラスにアクセスできません。
私は、なぜ彼らは公然と関連していないのですかと思います。。両方のクラスが共通のインターフェースを実装するか、StringBuilder
のサブクラスとしてStringBuffer
を持つことさえ意味があり、両方のクラスの共有コードの存在を可能にします。
なぜこの強制的な分離ですか?プログラマがスレッドセーフでないコードと誤ってスレッドセーフを混ぜることはありませんでしたか?それとも永遠の終わりに引き継がれるデザイン監督だったのでしょうか?
EDIT:
物事を明確にする:例えば、私は物事はこのようにしている理由についてを推測することができますが、私は、実際の意思決定への具体的な参照を期待していますJSRプロセス中に何が私にとって何らかの光を当てるものは、時にはある程度の困難を引き起こす状況です。
EDIT 2:
両方のクラスがAppendable
は完全に私の心を滑っ実装しているという事実。おそらく、その特定のインターフェイスは大部分の目的では役に立たないからです。単一の文字または準備されたオブジェクトだけを追加することができ、それだけです。ほとんどの場合、両方のクラスがサブクラスObject
であることよりも、それは有用ではありません。
EDIT 3:
さて、ここでa semi-official sourceから正確にこの質問の根拠がある:
評価は図書館チームによって:
それはデザインというのStringBufferとStringBuilderのです共有はありません public super type。それらは代替であることを意図していません.1つは mistake(StringBuffer)で、もう1つ(StringBuilder)は です。
一般的な上位型の欠如は、場合によっては、StringBufferからStringBuilderへの移行を望んでいる可能性があります。裏向きの は、共通のスーパータイプを追加することで、 のエラーを受け取り、公開されたインターフェースでそれらを守って、すべて 時間であることになります。これは単に移行を遅らせるだけではなく、それを逸脱します。
メソッドがあります。 append(long)は両方のクラスにありますが、インタフェースはありません。 –
私はVectorとArrayListがAbstractListをどのように拡張するかのように思っていますが、StringBufferとStringBuilderは同様の抽象クラスを拡張できました。私は最新のソースを見ていないが、StringBuilderは同期を除いたStringBufferの真っ直ぐな邪魔に見えた。 –
@MatthewFlaschen append()はAppendableからのものです。 –