2012-02-25 11 views
50

私は単純なDTOのためにtoString()を実装するために、commons-langでToStringBuilder.reflectionToString(class)を使用しました。今はApache Commonsライブラリの代わりにGoogle Guavaを使用しようとしています。そしてGuavaにObjects.ToStringHelperが見つかりました。しかし、クラスに多くのメンバーがいる場合はあまりにも冗長です。例えば:私はコモンズ-langの使用している場合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(); 
} 

ははるかに簡単です:

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

はグアバと、ないコモンズ-LANGとtoString()を実装するために任意のより良い方法はありますか?

Guava docs

答えて

105

私はグァバのcom.google.common.base.MoreObjects.toStringHelper()ためのちょっとしたトリックを持っています。 toString()メソッドを自動生成するときにIntelliJ IDEAを使用するように設定しました。私はあなたがEclipseで同じことができると仮定します。ここでのIntelliJでそれを行う方法は次のとおりです。toString()

  • を選択し、 "生成" メニュー
  • をポップアップするために挿入Altキー + を打つ

    • は、クラス内
    • を行く「[設定]をクリックします"ボタン
    • [テンプレート]タブ
    • 新しいテンプレートを作成する

      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(); 
      } 
      
    • 、テンプレートを保存し、「設定」を閉じ、「生成:「グァバのMoreObjects.toStringHelper()」に(私は「ToStringBuilder」テンプレートをコピーしてそれをしなかった)

    • 変更テンプレートの名前toString()方法

    を生成するときに、あなたがクラスに新しいフィールドを追加すると、あなたが今、単に再、Guava's MoreObjects.toStringHelper()テンプレートを選択することができますのtoString()」ウィンドウ

  • toString()メソッドを生成してください(IDEAは、既存のtoString()メソッドを置き換えるかどうか確認するよう求めます)。

  • +14

    *私はあなたがEclipse *で同じことをすることはできないと思います。 –

    +0

    ありがとうございますこれは私のためにうまく動作しますが、私はマルチコアスタイルのapacheコモンズがありません: '( –

    +0

    非常に便利です!ありがとうございました! –

    30

    MoreObjects.toStringHelperあなたが簡単に一貫性のある形式でtoString()メソッドを書く支援するためのもの、それはあなたがtoString()に含めると、手動でそれを書き出すに匹敵する性能を持つ必要がありますフィールド何を制御することができますされています。 reflectionToStringは入力するのが短くなりますが、含まれているフィールドを明示的に制御することはできません。また、反射を使用します。私はそれをより良い選択肢とは見なさない。

    私はtoStringHelperを使用すると、1行に1つの電話をaddコールすれば、よりクリーンに見えると思います。

    Guava docs

    +0

    よろしくお願いします。 – philipjkim

    10

    Guavaクラスを使用してtoStringメソッド(およびハッシュコードも同様)を生成できるプラグインhttp://sourceforge.net/projects/guavaeclipse/(本当に小さなもの)があります。生成されたメソッドは実際には小さく、クラスを乱雑にしないので、これは素晴らしい解決策です。

    +0

    説明の問題:このプラグインは完璧ではありません。たとえば、ネストされたクラスに対してtoStringメソッドを生成することはできませんが、とにかく、90%のケースでこれで十分です。 –

    +0

    うーん...私は何とかこれを行うことができます...ただ、内部クラスの名前を選択して、先に進む... –

    4

    Objects.toStringHelperは(2016年6月に完全に削除されるように)MoreObjects.toStringHelperを推奨していません。私はIntellij IDEのデフォルトGuavaテンプレートをMoreObjectsを使用する新しいテンプレートにコピーしました。乾杯。利用できるのEclipseプラグインの

    Guava docs

    +0

    MoreObjectsを使用するために受け入れられた答えを編集しました。 –

    3

    guavaeclipseはまだMoreObjects.toStringHelperを使用していますが、JenerateはMoreObjects.toStringHelperを使用し、魔法のように動作します。 Eclipseで

    Guava docs

    +0

    これがどのように役立つか少し詳しく説明できますか? – Cristik

    +0

    トップの受け入れられた答えは、IntelliJを使用してMoreObjects.toStringHelper toStringメソッドを生成する方法を説明していますが、多くのEclipseユーザーには役に立たないものです。他の回答はguavaeclipseプラグインに言及していますので、試してみましたが、廃止予定のObjects.toStringHelperを使用しています。それから私はJenerateにつまずいたので、私は分かち合うと思った。 – James

    +0

    説明をお寄せいただきありがとうございます。回答に追加することもできますか? – Cristik

    0

    あなたは(https://stackoverflow.com/a/9445402/1301197 IntelliJのほど強力ではない)テンプレートを作成することができます。それはあなたのためのすべてのメンバフィールド間でループしませんが、あなたは、少なくとも周囲のコード

    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(); 
    } 
    

    日食のtoString()発電機を使用して、カスタムのtoString()ビルダーを作成することによって、よりよい解決策は、おそらくそこにあることに注意してください。しかし、これは私のような怠惰な人にとってはあまりにも多くの仕事です。

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

    関連する問題