web-dev-qa-db-ja.com

Google GuavaのObjects.ToStringHelperを使用する

Commons-langでToStringBuilder.reflectionToString(class)を使用して、単純なDTOにtoString()を実装しました。現在、Apache commonsライブラリの代わりにGoogle Guavaを使用しようとしています。そして、グアバで_Objects.ToStringHelper_を見つけました。しかし、クラスに多くのメンバーがいる場合は冗長すぎます。例えば:

_@Override
public String toString() {
    return MoreObjects.toStringHelper(this.getClass()).add("name", name)
            .add("emailAddress", emailAddress)
            .add("department", department).add("yearJoined", yearJoined)
            .toString();
}
_

commons-langを使用すると、はるかに簡単になります。

_@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this);
}
_

Commons-langではなくGuavaでtoString()を実装するより良い方法はありますか?

グアバドキュメント

52
philipjkim

Guavaのcom.google.common.base.MoreObjects.toStringHelper()にはちょっとしたトリックがあります。 toString()メソッドを自動生成するときに使用するようにIntelliJ IDEAを設定しました。 Eclipseでも同じことができると思います。 Intellijで行う方法は次のとおりです。

  • クラスの中に入る
  • ヒット Alt + Insert 「生成」メニューをポップアップするには
  • toString()を選択します
  • 「設定」ボタンをクリックします
  • 「テンプレート」タブに移動します
  • 「Guava's MoreObjects.toStringHelper()」という名前の新しいテンプレートを作成します(「ToStringBuilder」テンプレートをコピーして作成しました)
  • テンプレートを次のように変更します。

    _public String toString() {
    #set ($autoImportPackages = "com.google.common.base.MoreObjects")
        return MoreObjects.toStringHelper(this)
    #foreach ($member in $members)
        .add("$member.name", $member.accessor)
    #end
        .toString();
    }
    _
  • テンプレートを保存し、「設定」ウィンドウと「Generate toString()」ウィンドウを閉じます

  • Guava's MoreObjects.toStringHelper()メソッドを生成するときにtoString()テンプレートを選択できるようになりました

クラスに新しいフィールドを追加するときは、toString()メソッドを再生成するだけです(IDEAは、既存のtoString()メソッドを置き換えることを確認するように求めます)。

110
Etienne Neveu

_MoreObjects.toStringHelper_は、一貫した形式のtoString()メソッドを簡単に記述できるようにすることを目的としていますが、toString()に含めるフィールドを制御でき、書き込みに匹敵するパフォーマンスが必要です。手動で出力します。 reflectionToStringは入力が短くなりますが、含まれるフィールドを明示的に制御することはできず、反射を使用します。私はそれをより良い代替手段とは思わない。

補足として、1行にtoStringHelper呼び出しを1つ入れると、addを使用するほうがずっときれいに見えると思います。

グアバドキュメント

30
ColinD

プラグイン http://sourceforge.net/projects/guavaeclipse/ (本当に小さいプラグイン)があり、Guavaクラスを使用してtoStringメソッド(およびハッシュコードと同等)を生成できます。生成されたメソッドは本当に小さく、クラスを混乱させないため、これは素晴らしいソリューションです。

11
marek.dominiak

MoreObjects.toStringHelperを支持して、Objects.toStringHelperが推奨されなくなりました(2016年6月に完全に削除される)。 Intellij IDEのデフォルトのGuavaテンプレートを、MoreObjectsを代わりに使用する新しいテンプレートにコピーしました。

グアバドキュメント

4
Morgan Kobeissi

使用可能なEclipseプラグインのうち、 guavaeclipse は引き続きMoreObjects.toStringHelperを使用していますが、 Jenerate はMoreObjects.toStringHelperを使用し、チャームのように機能します。

グアバドキュメント

3
James

Eclipseでは、テンプレートを作成できます(IntelliJほど強力ではありません) https://stackoverflow.com/a/9445402/1301197 =)。すべてのメンバーフィールドをループするわけではありませんが、少なくとも周囲のコードを取得します

_windows > preferences > Java > Editor > Templates_

_${:import(com.google.common.base.MoreObjects)}
@Override
public String toString() {
    return MoreObjects.toStringHelper(this)
    .add("${field}",${field})
    .toString();
}
_

これによりインポートが追加され、フィールドにidと入力すると、このようなものが得られます。次に、残りのフィールドを追加します。

_public String toString()
{
    return MoreObjects.toStringHelper(this).add("id", id).toString();
}
_

EclipseのtoString()ジェネレーターを使用して、カスタムのtoString()ビルダーを作成することにより、おそらくより良いソリューションがあることに注意してください。しかし、これは私のような怠け者にとっては大変な作業です。

右クリックしてsource > generate toString()を選択し、コードスタイル内のカスタムtoString()Builderを選択します。

0