我在commons-lang中使用ToStringBuilder.reflectionToString(class)
来实现简单DTO的toString()
。现在我正在尝试使用Google Guava而不是Apache commons库。我在番石榴中发现了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);
}
有没有更好的方法可以用Guava实现toString()
,而不是用commons-lang来实现?
答案 0 :(得分:109)
我对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();
}
保存模板,关闭“设置”和“生成toString()”窗口
Guava's MoreObjects.toStringHelper()
方法toString()
模板
当您向班级添加新字段时,只需重新生成toString()
方法(IDEA会要求您确认是否要替换现有的toString()
方法)。
答案 1 :(得分:30)
MoreObjects.toStringHelper
旨在帮助您轻松地以一致的格式编写toString()
方法,但它可让您控制toString()
中包含的字段,并且其性能可与编写它相媲美手动输出。键入的reflectionToString
较短,但它不会让您明确控制所包含的字段,而且它使用反射。我认为这不是一个更好的选择。
作为旁注,我认为如果每行拨一个toStringHelper
次呼叫,使用add
会更清晰。
答案 2 :(得分:11)
有一个插件http://sourceforge.net/projects/guavaeclipse/(非常小)可以使用Guava类生成toString方法(以及等于hashcode)。这是一个很好的解决方案,因为生成的方法非常小,不会使类混乱。
答案 3 :(得分:4)
值得注意的是,Objects.toStringHelper已被弃用(将于2016年6月完全删除),转而支持MoreObjects.toStringHelper。我已将Intellij IDE中的默认Guava模板复制到使用MoreObjects的新模板中。欢呼声。
答案 4 :(得分:3)
在可用的Eclipse插件中,guavaeclipse仍在使用MoreObjects.toStringHelper,但Jenerate使用MoreObjects.toStringHelper并且像魅力一样工作。
答案 5 :(得分:0)
在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()
,然后在代码样式中选择Custom toString()Builder。