【问题标题】:Using Google Guava's Objects.ToStringHelper使用 Google Guava 的 Objects.ToStringHelper
【发布时间】:2012-03-15 17:15:30
【问题描述】:

我在 commons-lang 中使用了 ToStringBuilder.reflectionToString(class),为简单的 DTO 实现 toString()。现在我正在尝试使用 Google Guava 而不是 Apache 公共库。我在番石榴中找到了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);
}

有没有更好的方法来实现toString() 使用 Guava,而不是使用 commons-lang?

Guava docs

【问题讨论】:

标签: java guava tostring


【解决方案1】:

在 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。

【讨论】:

    【解决方案2】:

    在可用的 Eclipse 插件中,guavaeclipse 仍在使用 MoreObjects.toStringHelper,但 Jenerate 使用的是 MoreObjects.toStringHelper,并且工作起来非常有魅力。

    Guava docs

    【讨论】:

    • 你能详细说明一下这有什么帮助吗?
    • 最受欢迎的答案讨论了如何使用 IntelliJ 生成 MoreObjects.toStringHelper toString 方法,但这对许多 Eclipse 用户来说没有用。其他回复提到了 guavaeclipse 插件,所以我试了一下,但它使用了已弃用的 Objects.toStringHelper。然后我偶然发现了 Jenerate,它起作用了,所以我想我会分享。
    • 感谢您的解释,您能否也将其添加到答案中,哪里更明显?
    • 嗨,感谢 MoreObjects 的提示。 GuavaEclipsePlugin 从 1.4.0 版本开始支持 MoreObjects。请查看guavaeclipsehelperteam.github.io
    【解决方案3】:

    值得注意的是,Objects.toStringHelper 已被弃用(将于 2016 年 6 月完全删除),取而代之的是 MoreObjects.toStringHelper。我已将 Intellij IDE 中的默认 Guava 模板复制到一个使用 MoreObjects 的新模板中。干杯。

    Guava docs

    【讨论】:

      【解决方案4】:

      MoreObjects.toStringHelper 旨在帮助您轻松编写具有一致格式的toString() 方法,但它可以让您控制您在toString() 中包含哪些字段,并且应该具有与手动编写它相当的性能。 reflectionToString 的类型更短,但它不能让您显式控制包含的字段,而且它使用反射。我不认为它是更好的选择。

      附带说明一下,如果您每行调用一个 add,我认为使用 toStringHelper 看起来会更干净。

      Guava docs

      【讨论】:

        【解决方案5】:

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

        • 进入班级
        • 点击 Alt + Insert 弹出“生成”菜单
        • 选择toString()
        • 点击“设置”按钮
        • 转到“模板”标签
        • 创建一个名为“Guava's 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()”窗口

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

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

        【讨论】:

        • 我假设你可以在 Eclipse 中做同样的事情不,没有机会。
        • 谢谢这对我来说很好,但我错过了 apache commons 的多行样式:'(
        • 此模板已添加到 IntelliJ 12.1(在 build 124.567 中),请参阅 youtrack.jetbrains.com/issue/IDEA-90598
        • 你不是说“12.1.6”吗?当我使用“Alt + Insert”或单击“代码”->“生成”时,我看到以下菜单:i.imgur.com/nZPf1Rg.png。底部的“toString()”打开“生成 toString()”菜单,您可以从不同的模板中进行选择。你能检查一下你的设置中是否启用了“GenerateToString”插件吗?
        • 对于 IntelliJ 13.1.4+,我看到一个类似的 toString() 模板现在可以在默认安装中使用。很棒。
        【解决方案6】:

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

        【讨论】:

        • 澄清一下:这个插件并不完美——例如,无法为嵌套类生成 toString 方法,但无论如何,在 90% 的情况下这已经足够了。
        • 嗯...我可以做到这一点...只需选择内部类的名称并继续...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-20
        • 1970-01-01
        • 2012-01-28
        • 1970-01-01
        • 2011-10-18
        • 1970-01-01
        • 2013-10-10
        相关资源
        最近更新 更多