使用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”菜单
  • selecttoString()
  • 点击“设置”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()包含的字段,并且应该具有与手动写出相同的性能。 reflectionToStringtypes较短,但不能显式控制包含的字段,而且它使用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。