ポイントはCharSequence
、文字シーケンスに読み取り専用ビューを提供することです。それだけです。このインターフェイスは、文字列操作や検索方法を提供しません。それらは範囲外です。
インターフェイス分離の原則は、あるタイプのクライアントが使用しないメソッドに依存すべきではないことを示唆しています。したがって、インターフェイスは最小限の有用なセットのみを宣言する必要があります。別のユースケースで別のメソッドが必要な場合は、別のインターフェイスが必要です。
文字ソースのみを必要とするクライアントは、おそらく検索メソッドを必要としません。
もちろん、この原則をやり過ぎて、1000個の小さなインターフェイスになる可能性があります。それも良くありません。したがって、CharSequence
インターフェースには、最小限のメソッドcharAt()
とlength()
メソッドだけでなく、深く関連する便利なメソッドも含まれていますsubSequence()
。(CharSequenceは、文字列のコピーなしでサブシーケンスにビューを提供する可能性が高いため、これがインスタンスメソッドである必要があります)。toString()
とにかくそのメソッドが継承されるため、指定は問題ありませんObject
。メソッドchars()
とインターフェイスにcodePoints()
適応CharSequence
しStream
ます。これらはデフォルトのメソッドであるため、を実装するクラスに追加の要件を課しませんCharSequence
。
このCharSequence
タイプは、メソッドが特定の実装を指定せずに汎用文字ソースを必要とする場合に便利です(たとえば、String vs. CharBuffer vs. StringBuilder)。String#join()
およびString#contains()
方法は、使用しての良い例ですCharSequence
秒。
メソッドは外部で実装できるためCharSequence
、contains()
メソッドを提供する必要はありません。JavaにはC#の拡張メソッドの便利さはありませんが、静的メソッドは本質的に同じものです。だからboolean Editable#contains(CharSequence needle)
あなたの代わりにstatic boolean contains(CharSequence haystack, CharSequence needle)
。文字列検索アルゴリズムは、よく研究されているコンピューターサイエンスのトピックです。トレードオフの異なるさまざまなアルゴリズムがすぐに利用できます。
参考文献:
contains
、突然変異メソッドではなく、検索メソッドが存在します(charAt
)。また、「これらはデフォルトのメソッドであるため、CharSequenceを実装するクラスに追加の要件を課しません。」-contains
implを介してデフォルトとして実装できなかったため、実装return to String().contains(...)
するクラスの要件がなくなりましたか?