使用Google Guava的Objects.ToStringHelper
我使用了commons-lang中的ToStringBuilder.reflectionToString(class)
来实现简单DTO的toString()
。 现在我正在尝试使用Google Guava而不是Apache commons库。 我在Guava中findObjects.ToStringHelper
。 但如果class上有很多成员,那就太冗长了。 例如:
@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); }
有没有更好的方法来实现toString()
与番石榴,而不是commons-lang?
番石榴文档
我有一个Guava的com.google.common.base.MoreObjects.toStringHelper()
的小技巧。 我configuration了IntelliJ IDEA以在自动生成toString()
方法时使用它。 我假设你可以在Eclipse中做同样的事情。 以下是如何在Intellij中做到这一点 :
- 去上课
- 点击Alt + Insertpopup“Generate”菜单
- select
toString()
- 点击“设置”button
- 转到“模板”选项卡
- 创build一个名为“Guava的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(); }
-
保存模板,closures“设置”和“生成toString()”窗口
- 你可以在生成
toString()
方法时selectGuava's MoreObjects.toStringHelper()
模板
当你为这个类添加一个新的字段时,只需重新生成toString()
方法(IDEA会要求你确认是否要replace现有的toString()
方法)。
MoreObjects.toStringHelper
旨在帮助您轻松地以一致的格式编写toString()
方法,但是它可以让您控制toString()
包含的字段,并且应该具有与手动写出相同的性能。 reflectionToString
types较短,但不能显式控制包含的字段,而且它使用reflection。 我不认为这是一个更好的select。
作为一个方面的说明,我认为使用toStringHelper
看起来很干净,如果你每行add
一个调用。
番石榴文档
有一个插件http://sourceforge.net/projects/guavaeclipse/ (真的很小),它可以使用Guava类生成toString方法(也可以是hashcode)。 这是一个很好的解决scheme,因为生成的方法非常小,不会混乱课程。
值得注意的是,Objects.toStringHelper已被弃用(2016年6月完全删除),以支持更多的Objects.toStringHelper。 我已将我的Intellij IDE中的默认Guava模板复制到使用MoreObjects的新模板中。 干杯。
番石榴文档
在可用的Eclipse插件中, guavaeclipse仍在使用MoreObjects.toStringHelper,但Jenerate使用MoreObjects.toStringHelper,并且像一个魅力。
番石榴文档
在Eclipse中,你可以创build一个模板(不像IntelliJ https://stackoverflow.com/a/9445402/1301197 )强大。 它不会遍历所有的成员字段,但你至less得到周围的代码
windows > preferences > Java > Editor > Templates
${:import(com.google.common.base.MoreObjects)} @Override public String toString() { return MoreObjects.toStringHelper(this) .add("${field}",${field}) .toString(); }
这将添加导入,你会得到这样的东西,如果你inputid
作为领域。 然后由您来添加剩余的字段。
public String toString() { return MoreObjects.toStringHelper(this).add("id", id).toString(); }
请注意,使用eclipse toString()生成器并创build自定义的toString()构build器可能会有更好的解决scheme。 但对于像我这样懒惰的人来说,这太过分了。
右键单击source > generate toString()
并在代码样式中selectCustom toString()Builder。
- Apache Commons与Guava(前身为“Google Collections”)
- 值为空时如何避免caching?
- Eclipse 1.5.0插件Maven不能安装在开普勒下
- 如何JUnittesting两个List <E>包含相同的顺序相同的元素?
- 不可修改的地图(Java Collections)vs ImmutableMap(Google)
- 番石榴:为什么没有Lists.filter()函数?
- Java的番石榴图书馆; 它最有用和/或隐藏的特性是什么?
- Google-guava checkNotNull和IntelliJ IDEA的“可能会产生java.lang.NullPointerException”
- 我怎样才能收集一个Java 8stream到一个番石榴ImmutableCollection?