使用Google Guava的Objects.ToStringHelper

时间:2012-02-25 13:55:43

标签: java guava tostring

我在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来实现?

Guava docs

6 个答案:

答案 0 :(得分:109)

我对Guava的com.google.common.base.MoreObjects.toStringHelper()有一个小技巧。我在自动生成toString()方法时配置了 IntelliJ IDEA 以使用它。我假设你可以在 Eclipse 中做同样的事情。以下是如何在 Intellij 中执行此操作:

  • 进入课堂
  • 点击 Alt + 插入以弹出“生成”菜单
  • 选择toString()
  • 点击“设置”按钮
  • 转到“模板”标签
  • 创建一个名为“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();
    }
    
  • 保存模板,关闭“设置”和“生成toString()”窗口

  • 您现在可以在生成Guava's MoreObjects.toStringHelper()方法
  • 时选择toString()模板

当您向班级添加新字段时,只需重新生成toString()方法(IDEA会要求您确认是否要替换现有的toString()方法)。

答案 1 :(得分:30)

MoreObjects.toStringHelper旨在帮助您轻松地以一致的格式编写toString()方法,但它可让您控制toString()中包含的字段,并且其性能可与编写它相媲美手动输出。键入的reflectionToString较短,但它不会让您明确控制所包含的字段,而且它使用反射。我认为这不是一个更好的选择。

作为旁注,我认为如果每行拨一个toStringHelper次呼叫,使用add会更清晰。

Guava docs

答案 2 :(得分:11)

有一个插件http://sourceforge.net/projects/guavaeclipse/(非常小)可以使用Guava类生成toString方法(以及等于hashcode)。这是一个很好的解决方案,因为生成的方法非常小,不会使类混乱。

答案 3 :(得分:4)

值得注意的是,Objects.toStringHelper已被弃用(将于2016年6月完全删除),转而支持MoreObjects.toStringHelper。我已将Intellij IDE中的默认Guava模板复制到使用MoreObjects的新模板中。欢呼声。

Guava docs

答案 4 :(得分:3)

在可用的Eclipse插件中,guavaeclipse仍在使用MoreObjects.toStringHelper,但Jenerate使用MoreObjects.toStringHelper并且像魅力一样工作。

Guava docs

答案 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。