String.indexOf
インターフェイスの一部を作成する際の欠点はわかりませんCharSequence
。利点は、StringBufferやStringBuilderなどの他のクラスもindexOfメソッドを実装する必要があることです。
indexOf
それで、なぜ一部だけであるべきなのかという設計上の理由はありString
ますか?
ありがとうございました。
String.indexOf
インターフェイスの一部を作成する際の欠点はわかりませんCharSequence
。利点は、StringBufferやStringBuilderなどの他のクラスもindexOfメソッドを実装する必要があることです。
indexOf
それで、なぜ一部だけであるべきなのかという設計上の理由はありString
ますか?
ありがとうございました。
この理由はわかりませんが、を実装するクラスの例を示すことができますCharSequence
。ですjava.nio.CharBuffer
。
理論的には、ループindexOf()
で呼び出すことで実装できます。charAt()
ただし、ユーザーが期待するとおりには機能しません。2つの状況を区別することはできません:キャラクターはまだそこにいない、そしてキャラクターはそこにいない、そしてそこにいないでしょう。2番目のケースindexOf()
では、契約により-1を返す必要があります。最初のケースでは、すべてのバイトが到着するまで待機する必要があります。ただし、CharBufferは非ブロッキングIOに属しているため、ブロッキングできません。
これが考えられる理由の少なくとも1つを説明していると思います。
編集:
@Pacerierによる非常に貴重なコメントに続いて、以下を追加したいと思います。CharSequence
さまざまな状況で使用される非常に一般的なインターフェイスとしてのIMHO 。このインターフェイスの最もよく知られている実装者はString
でStringBuffer
ありStringBuilder
、任意の文字に直接アクセスできるデータ構造でコンテンツ全体を保持します。ただし、これは一般的な場合は間違っています。java.nio.CharBuffer
そのような場合の例です。
indexOf
操作はあらゆる種類のシーケンスに意味があるため、これは単なる見落としだと思います。
Java 8は、これらの問題のいくつかを解決する可能性があります。これにより、インターフェースでのデフォルトの実装が可能になります。例えば
interface List {
void sort() default Collections.sort(this);
}
これにより、すべての実装者にそのメソッドを実装する負担をかけることなく、インターフェイスに追加のメソッドを追加できます。