24

パッケージのパブリック インターフェイス (API) を設計しています。CharSequenceの代わりに一般的に使用する必要があるのだろうかString。(私は主にパブリック インターフェイスについて話しています)。

そうすることの欠点はありますか?それは良い習慣と考えられていますか?

識別子のような目的 (値がハッシュベースのコンテナー内のセットと照合される場合) に使用するのはどうですか?

4

5 に答える 5

34

CharSequence汎用ライブラリではめったに使用されません。通常、主なユースケースが文字列の処理 (操作、解析など) である場合に使用する必要があります。

一般的に言えば、 a でできることは何でも aCharSequenceで行うことができます( everyを a にString変換できるので、自明です)。ただし、重要な違いが 1 つあります。Aが不変であるとは限りません。a を処理して 2 つの異なる時点で検査すると、毎回同じ値になることが保証されます。CharSequenceStringCharSequenceString

しかし、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オブジェクトを処理する方法を文書化する必要があります。例: 「メソッドの実行中に引数を変更すると、未定義の動作が発生します。」

于 2012-11-05T15:10:57.347 に答える
6

これは必要なものによって異なりますが、 の 2 つの利点を述べたいと思いますString

CharSequenceのドキュメントから:

各オブジェクトは異なるクラスによって実装される可能性があり、各クラスがそのインスタンスが他のインスタンスと等しいかどうかをテストできるという保証はありません。したがって、任意の CharSequence インスタンスをセット内の要素として、またはマップ内のキーとして使用することは不適切です。

したがって、Mapまたは信頼できるequals/が必要なときはいつでもhashCode、インスタンスをString(または何でも) にコピーする必要があります。

CharSequenceさらに、実装が不変でなければならないことを明示的に言及していないと思います。実装が遅くなる可能性がある防御的なコピーを行う必要がある場合があります。

于 2012-11-05T15:11:58.213 に答える
5

JavaCharSequenceはインターフェースです。API が言うように、、、、クラスでCharSequence実装されています。したがって、これらすべてのクラスから API にアクセスしたり、API を受け入れたりしたい場合は、あなたの選択です。そうでない場合は、非常に簡単で誰もが知っているため、公開 API には非常に適しています。4 つのメソッドしか与えられないことを忘れないでください。したがって、メソッドを介してオブジェクトを受け入れる場合、入力操作能力は制限されます。CharBufferSegmentStringStringBufferStringBuilderCharSequenceStringCharSequenceCharSequence

于 2012-11-05T15:07:04.923 に答える
0

の使用は推奨さCharSequenceれないため、パスワードを保持するように実装できます。実装には、プレーン テキスト データを消去する dispose メソッドが必要です。String

于 2012-11-12T12:37:14.410 に答える