使用Google Guava的Objects.ToStringHelper

phi*_*kim 53 java tostring guava

ToStringBuilder.reflectionToString(class)在commons-lang中用来实现toString()简单的DTO.现在我正在尝试使用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();
}
Run Code Online (Sandbox Code Playgroud)

如果我使用commons-lang则更简单:

@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this);
}
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法来实施toString()番石榴,而不是公共场所?

番石榴文件

Eti*_*veu 111

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

  • 进去上课
  • 点击Alt+ Insert弹出"生成"菜单
  • 选择 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();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 保存模板,关闭"设置"和"生成toString()"窗口

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

向类中添加新字段时,只需重新生成该toString()方法(IDEA将要求您确认是否要替换现有toString()方法).

  • 此模板已添加到IntelliJ 12.1(在构建124.567中),请参阅http://youtrack.jetbrains.com/issue/IDEA-90598 (19认同)
  • *我假设你可以在Eclipse*中做同样的事情,但没有机会. (14认同)
  • 你的意思是"12.1.6"吗?当我使用"Alt + Insert"或点击"Code" - >"Generate"时,我会看到以下菜单:http://i.imgur.com/nZPf1Rg.png.底部的"toString()"打开"Generate toString()"菜单,您可以在其中选择不同的模板.你能检查一下你的设置中是否启用了"GenerateToString"插件吗? (2认同)

Col*_*inD 30

MoreObjects.toStringHelper旨在帮助你写toString()一个统一的格式方法很容易,但它可以让你在哪些领域您在控制toString(),并应具有性能可媲美手动写出来.reflectionToString键入的时间较短,但它不能让您明确控制所包含的字段,并且它使用反射.我认为这不是一个更好的选择.

作为旁注,我认为toStringHelper如果add每行拨一个电话,使用看起来会更清晰.

番石榴文件


mar*_*iak 11

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


Mor*_*ssi 5

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

番石榴文档