9

String.indexOfインターフェイスの一部を作成する際の欠点はわかりませんCharSequence。利点は、StringBufferやStringBuilderなどの他のクラスもindexOfメソッドを実装する必要があることです。

indexOfそれで、なぜ一部だけであるべきなのかという設計上の理由はありStringますか?

ありがとうございました。

4

3 に答える 3

8

この理由はわかりませんが、を実装するクラスの例を示すことができますCharSequence。ですjava.nio.CharBuffer

理論的には、ループindexOf()で呼び出すことで実装できます。charAt()ただし、ユーザーが期待するとおりには機能しません。2つの状況を区別することはできません:キャラクターはまだそこにいない、そしてキャラクターはそこにいない、そしてそこにいないでしょう。2番目のケースindexOf()では、契約により-1を返す必要があります。最初のケースでは、すべてのバイトが到着するまで待機する必要があります。ただし、CharBufferは非ブロッキングIOに属しているため、ブロッキングできません。

これが考えられる理由の少なくとも1つを説明していると思います。

編集:

@Pacerierによる非常に貴重なコメントに続いて、以下を追加したいと思います。CharSequenceさまざまな状況で使用される非常に一般的なインターフェイスとしてのIMHO 。このインターフェイスの最もよく知られている実装者はStringStringBufferありStringBuilder、任意の文字に直接アクセスできるデータ構造でコンテンツ全体を保持します。ただし、これは一般的な場合は間違っています。java.nio.CharBufferそのような場合の例です。

于 2011-12-06T07:16:39.117 に答える
3

indexOf操作はあらゆる種類のシーケンスに意味があるため、これは単なる見落としだと思います。

于 2011-12-06T07:12:11.370 に答える
2

Java 8は、これらの問題のいくつかを解決する可能性があります。これにより、インターフェースでのデフォルトの実装が可能になります。例えば

interface List {
    void sort() default Collections.sort(this);
}

これにより、すべての実装者にそのメソッドを実装する負担をかけることなく、インターフェイスに追加のメソッドを追加できます。

于 2011-12-06T08:14:16.007 に答える