2012-03-19 9 views
8

JavaのStringBuilderStringBufferの違いについては十分に文書化されており、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への移行を望んでいる可能性があります。裏向きの は、共通のスーパータイプを追加することで、 のエラーを受け取り、公開されたインターフェースでそれらを守って、すべて 時間であることになります。これは単に移行を遅らせるだけではなく、それを逸脱します。

答えて

3

私はJSR参照を持っていませんが、私の経験からです。 StringBuilderサブクラスは、パフォーマンス上の理由のための良いアイデアではないよう

  • StringBuffer:以下のいくつかの理由があります。 StringBufferをスレッドセーフにするためには、すべての呼び出しをオーバーヘッドの多いStringBuilderにマスクする必要があります。

  • あなたはJavaがjava.util.Collections.synchronized*のAPIを介してjava.lang.concurrentを追加した理由であるクラスの内部を直接アクセスを持っている場合は、さらに、最適化することができ、上記の点に追加します。より多くの直接的なアクセスが最適化のためのより多くの選択肢を与えるので。クラスの両方がfinalあるとしてさらに最初のポイントに追加するこの時点にReference from the IBM blog

  • をセンターサポートするために、私はないが、これは設計ミスだと思いますので、間違いなく彼らは、これらのクラスをサブクラス化したくありません。

  • 同じインターフェイスについては、両方のクラスが同じインターフェイスを実装します。つまり、Serializable, Appendable, CharSequenceです。だから彼らはドロップインの代わりです。唯一のことは、1つの共通インタフェースを実装するのではなく、3つの共通インタフェースを実装することです。技術的には現在のインターフェース(Serializable, Appendable, CharSequence)の合計になる膨大なインターフェースを1つ必要としないので、意味があります。

はEDIT:@MatthewFlaschen点に

  • 、実装されたインタフェースのいずれかでのw/StringBufferStringBuilder B同じであるがないAPIが存在すること。これは下位互換性と関連しています。新しいAPIを追加したいが、インターフェイスが他の多くのクラスで使用されているため、インターフェイスを変更することは実現可能ではない可能性があります。それは、Javaの人が作ったかもしれない決定をよく考えている。だから私は間違いを言いません。

EDIT 2:

SIDE注:注意すべきもう一つは、StringBufferは1.0と1.5でStringBuilderで導入されたということです。したがって、両方のクラスには存在しますが、インタフェースには存在しないapiは、これらのクラスを作成する時点ではなく後で導入されます。

+0

メソッドがあります。 append(long)は両方のクラスにありますが、インタフェースはありません。 –

+0

私はVectorとArrayListがAbstractListをどのように拡張するかのように思っていますが、StringBufferとStringBuilderは同様の抽象クラスを拡張できました。私は最新のソースを見ていないが、StringBuilderは同期を除いたStringBufferの真っ直ぐな邪魔に見えた。 –

+0

@MatthewFlaschen append()はAppendableからのものです。 –

2

実際には両方ともAppendableを実装しています。

これは役に立たないと私は同意しません。私の経験では、StringBuilder/StringBufferの使い方の大部分は文字列(CharSequenceを実装している)を扱っているだけです。それ以外の場合は、String.valueOfに電話をかけることができます。

append(long)のような他のメソッドもあると便利です。しかしそれは本質的ではありません。

共通のインターフェイスを持つことは妥当でしょう。それらはパフォーマンスとスレッド特性が異なりますが、JDKの多くのインターフェイスでうまくいきます。

は、スレッドベースのスレッドセーフリスト(書き込みごとに新しいリストを作成します)の中で、たとえばCopyOnWriteArrayListです。スレッドセーフではないリンクリストです。

+0

あなたはその質問に答えなかったし、なぜそうであるかについての洞察も与えなかった。 – FriendlyGuy

+0

@MackieChan、私は同意しない。私は「共通のインターフェースを持つことは合理的だろう」と言いました。これは「はい、それは設計監督です」と言っている別の方法です。 –

+0

正直なところ、Appendableは私の心を滑りました。主に定期的に数字を追加しています。私のコードで。私は実際にその特定のインターフェイスが非常に有用であるとは思いません。なぜなら、すべてを文字列に変換する必要があるからです。既存のコンテンツが不変であることは言うまでもありません... – thkala

関連する問題