パッケージのパブリック インターフェイス (API) を設計しています。CharSequence
の代わりに一般的に使用する必要があるのだろうかString
。(私は主にパブリック インターフェイスについて話しています)。
そうすることの欠点はありますか?それは良い習慣と考えられていますか?
識別子のような目的 (値がハッシュベースのコンテナー内のセットと照合される場合) に使用するのはどうですか?
パッケージのパブリック インターフェイス (API) を設計しています。CharSequence
の代わりに一般的に使用する必要があるのだろうかString
。(私は主にパブリック インターフェイスについて話しています)。
そうすることの欠点はありますか?それは良い習慣と考えられていますか?
識別子のような目的 (値がハッシュベースのコンテナー内のセットと照合される場合) に使用するのはどうですか?
CharSequence
汎用ライブラリではめったに使用されません。通常、主なユースケースが文字列の処理 (操作、解析など) である場合に使用する必要があります。
一般的に言えば、 a でできることは何でも aCharSequence
で行うことができます( everyを a にString
変換できるので、自明です)。ただし、重要な違いが 1 つあります。Aが不変であるとは限りません。a を処理して 2 つの異なる時点で検査すると、毎回同じ値になることが保証されます。CharSequence
String
CharSequence
String
しかし、CharSequence
それは必ずしも真実ではありません。たとえば、誰かがStringBuilder
あなたのメソッドに a を渡し、あなたがそれで何かをしている間にそれを変更する可能性があり、多くの正常なコードを壊す可能性があります.
次の疑似コードを検討してください。
public Object frobnicate(CharSequence something) {
Object o = getFromCache(something);
if (o == null) {
o = computeValue(something);
putIntoCache(o, something);
}
return o;
}
これは無害に見えますが、String
ここで使用した場合はほとんど機能します (値が 2 回計算される可能性があることを除いて)。しかし、something
が の場合CharSequence
、その内容はgetFromCache
呼び出しと呼び出しの間で変わる可能性がありcomputeValue
ます。さらに悪いことに、computeValue
通話と通話の間にputIntoCache
!
したがって、大きな利点があり、欠点を知っている場合にのみ受け入れてください。CharSequence
受け入れる場合CharSequence
は、API が可変CharSequence
オブジェクトを処理する方法を文書化する必要があります。例: 「メソッドの実行中に引数を変更すると、未定義の動作が発生します。」
これは必要なものによって異なりますが、 の 2 つの利点を述べたいと思いますString
。
各オブジェクトは異なるクラスによって実装される可能性があり、各クラスがそのインスタンスが他のインスタンスと等しいかどうかをテストできるという保証はありません。したがって、任意の CharSequence インスタンスをセット内の要素として、またはマップ内のキーとして使用することは不適切です。
したがって、Map
または信頼できるequals
/が必要なときはいつでもhashCode
、インスタンスをString
(または何でも) にコピーする必要があります。
CharSequence
さらに、実装が不変でなければならないことを明示的に言及していないと思います。実装が遅くなる可能性がある防御的なコピーを行う必要がある場合があります。
JavaCharSequence
はインターフェースです。API が言うように、、、、クラスでCharSequence
実装されています。したがって、これらすべてのクラスから API にアクセスしたり、API を受け入れたりしたい場合は、あなたの選択です。そうでない場合は、非常に簡単で誰もが知っているため、公開 API には非常に適しています。4 つのメソッドしか与えられないことを忘れないでください。したがって、メソッドを介してオブジェクトを受け入れる場合、入力操作能力は制限されます。CharBuffer
Segment
String
StringBuffer
StringBuilder
CharSequence
String
CharSequence
CharSequence