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()
を実装するより良い方法はありますか?
Guavaのcom.google.common.base.MoreObjects.toStringHelper()
にはちょっとしたトリックがあります。 toString()
メソッドを自動生成するときに使用するようにIntelliJ IDEAを設定しました。 Eclipseでも同じことができると思います。 Intellijで行う方法は次のとおりです。
toString()
を選択しますテンプレートを次のように変更します。
_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()
メソッドを置き換えることを確認するように求めます)。
_MoreObjects.toStringHelper
_は、一貫した形式のtoString()
メソッドを簡単に記述できるようにすることを目的としていますが、toString()
に含めるフィールドを制御でき、書き込みに匹敵するパフォーマンスが必要です。手動で出力します。 reflectionToString
は入力が短くなりますが、含まれるフィールドを明示的に制御することはできず、反射を使用します。私はそれをより良い代替手段とは思わない。
補足として、1行にtoStringHelper
呼び出しを1つ入れると、add
を使用するほうがずっときれいに見えると思います。
プラグイン http://sourceforge.net/projects/guavaeclipse/ (本当に小さいプラグイン)があり、Guavaクラスを使用してtoStringメソッド(およびハッシュコードと同等)を生成できます。生成されたメソッドは本当に小さく、クラスを混乱させないため、これは素晴らしいソリューションです。
MoreObjects.toStringHelperを支持して、Objects.toStringHelperが推奨されなくなりました(2016年6月に完全に削除される)。 Intellij IDEのデフォルトのGuavaテンプレートを、MoreObjectsを代わりに使用する新しいテンプレートにコピーしました。
使用可能なEclipseプラグインのうち、 guavaeclipse は引き続きMoreObjects.toStringHelperを使用していますが、 Jenerate はMoreObjects.toStringHelperを使用し、チャームのように機能します。
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を選択します。