2013-09-24 10 views
12

最近、Groovyのコレクションで使用されたときの動作について、GStringImplのvs Stringが読まれました。Groovy GStringImplとStringの振る舞い

私はこれが偽と評価理由は...

"${'test'}".equals("test") == false

GStringImplができなかった理由があった場合、しかし、私は思っていた、.equals()契約の対称性の要件によるものであることを理解しますすぐにStringに評価されるだけです。私はこのような何か...

"${'someString'}"

を行うとき、私はGStringImplを得ることはありませんので、私はちょうど私がすぐに、たとえば、マップ内のキーとして使用することができますプレーンJava String背中を取得します。

私は

String s = "${'someString'}"

ようしかし、このようなものは少し不便で、かつGStringImplString間の重複が整理は、Groovyのnewbeesにとって大きな「落とし穴」であると思われる、いくつかの回避策があることを知っています。

答えて

15

GStringsは、主に遅延評価(ロギングには非常に適しています)とテンプレート作成に関連する理由があるため、すぐにStringに評価されません。 Strings and GStringでは、良い説明を見つけることができます:それは 方法はGストリングはを評価されていることに呼び出される()のtoStringまでではありませんので、

GString遅延評価を含むことができます。この遅延評価 は、 文字列の計算、値のtoString()への呼び出し、および異なる文字列の連結 が遅延して実行されるようなロギングなどに役立ちます。

テンプレートエンジン、 を使用したくない場合、またはGStringの完全な遅延評価を実際に行う場合は、GStringは便利です。一部の 変数がGStringに埋め込まれている場合、toString()はその文字列 で呼び出され、文字列表現を取得し、最終文字列 に挿入されます。

したがって:

Gストリングと文字列は、2つの別個のクラスであるので、 オブジェクトをGストリング含む地図オブジェクトまたは比較のためのキーとしてGストリング オブジェクトを使用、文字列 と組み合わせた場合、予期しない結果を生成することができGStringとStringは同じhashCodeを持ちません。また、 は等しくなるからです。比較またはマップキーの2つのタイプの間に自動強制はありません。したがって、 はGStringオブジェクトに対して明示的にtoString()を呼び出す必要があることがあります。

予期しない文字列への変換は、コードが の場合、groovy.sqlクラスのメソッドと同様にGStringが必要な場合に問題になります。

+0

十分に適切です。説明ありがとう。 – rcgeorge23

+0

GStringImplクラスを動的に拡張して、構築時に.toString()を自動的に呼び出すことはできますか? –