CharSequenceがcontains(CharSequence)を定義しないのはなぜですか?


11

契約は同一なので、これはJava SEとAndroidの両方に適用されます。

CharSequencecontains(CharSequence)メソッドを定義しません。私は理由を見つけることができないようで、それを含めることは非常に有用でありCharSequence#toString()、文字のシーケンスをチェックするために呼び出す必要を防ぎます。

例えば、Androidの中で、ユーザーが呼び出すことを余儀なくされているEditable#toString()にもかかわらず、それは文字の配列を含むかどうかを確認するためにEditable実装しCharSequenceた場合に回避することができ、CharSequence定義されましたcontains(CharSequence)

この設計選択の背後にある考え方は何ですか?それは潜在的な見落としですか、またはこれには設計上の理由がありますか?

回答:


10

ポイントはCharSequence、文字シーケンスに読み取り専用ビューを提供することです。それだけです。このインターフェイスは、文字列操作や検索方法を提供しません。それらは範囲外です。

インターフェイス分離の原則は、あるタイプのクライアントが使用しないメソッドに依存すべきではないことを示唆しています。したがって、インターフェイスは最小限の有用なセットのみを宣言する必要があります。別のユースケースで別のメソッドが必要な場合は、別のインターフェイスが必要です。

文字ソースのみを必要とするクライアントは、おそらく検索メソッドを必要としません。

もちろん、この原則をやり過ぎて、1000個の小さなインターフェイスになる可能性があります。それも良くありません。したがって、CharSequenceインターフェースには、最小限のメソッドcharAt()length()メソッドだけでなく、深く関連する便利なメソッドも含まれていますsubSequence()。(CharSequenceは、文字列のコピーなしでサブシーケンスにビューを提供する可能性が高いため、これがインスタンスメソッドである必要があります)。toString()とにかくそのメソッドが継承されるため、指定は問題ありませんObject。メソッドchars()とインターフェイスにcodePoints()適応CharSequenceStreamます。これらはデフォルトのメソッドであるため、を実装するクラスに追加の要件を課しませんCharSequence

このCharSequenceタイプは、メソッドが特定の実装を指定せずに汎用文字ソースを必要とする場合に便利です(たとえば、String vs. CharBuffer vs. StringBuilder)。String#join()およびString#contains()方法は、使用しての良い例ですCharSequence秒。

メソッドは外部で実装できるためCharSequencecontains()メソッドを提供する必要はありません。JavaにはC#の拡張メソッドの便利さはありませんが、静的メソッドは本質的に同じものです。だからboolean Editable#contains(CharSequence needle)あなたの代わりにstatic boolean contains(CharSequence haystack, CharSequence needle)文字列検索アルゴリズムは、よく研究されているコンピューターサイエンスのトピックです。トレードオフの異なるさまざまなアルゴリズムがすぐに利用できます。

参考文献:


2
このインターフェイスは文字列操作や検索メソッドを提供しません。それらは範囲外です。」と言いますがcontains、突然変異メソッドではなく、検索メソッド存在します(charAt)。また、「これらはデフォルトのメソッドであるためCharSequenceを実装するクラスに追加の要件を課しません。」- containsimplを介してデフォルトとして実装できなかったため、実装return to String().contains(...)するクラスの要件がなくなりましたか?
ビンスエミー

1
@VinceEmighはい、contains()デフォルトの方法です。存在する場合String#containsは、別の方法で実装されるべきではありません:StringはCharSequence実装を使用する必要があります。charAt()異なっています。それは検索アルゴリズムを実装しません、それはの重要な部分ですCharSequence:それなしでは、コンテンツはのような異なるタイプにコピーできませんでしたString。ストリームはJava8の重要な部分であり、これらのデフォルトメソッドの追加は、などの他のインターフェースへの追加と一致していますCollection
アモン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.