您使用或看过的最好的toString构建器类是什么?是什么让它变得更好

时间:2011-01-21 06:08:00

标签: java class-design

让我们面对它编写好的toString消息是一件无聊的杂乱的工作,需要完成,因为它对调试器或日志记录中的检查真的有用。

你喜欢或希望在这样的帮助下有什么功能......

  • 转储属性应带有标签。

    name = mP country = Australia ...

  • 应该可以选择跳过某些默认值。

    • 没有必要打印许多0或null的属性。
    • 如果您设置了标签且值为null,则不要包括。
  • 标签和值之间的分隔符应该是可更新的,并且在添加标签和值时应自动插入它们之间。

  • 它还应该自动插入您选择的分隔符。

    如果你想在包含一个数组时让逗号在值之间留出空格,那就这样吧。

  • 它应该自动引用字符串值...因为知道字符串开始和结束的确切位置非常重要。

    * name = mP state =“新南威尔士”

  • 当添加列表,地图或集合时,应该遵守有关引用字符串的规则,使用set separator等。请不要只转储Collection.toString()。

我还有其他几个人正在改进,你可以列出自己的想法,观察等。

  new ToStringBuilder()
    .setLabelValueSeparator('=')
    .label("name")
    .value(Country.AUSTRALIA) // -> returns "Australia" without the quotes.
    .label("day of death")
    .value(null) //
    .label("numbers")
    .valueSeparator(",");
    .value(Arrays.asList( 1, 2, 3 )
    .build();

当然会导致“name =”Australia“number = 1,2,3;

2 个答案:

答案 0 :(得分:20)

Apache ToStringBuilder有一个很好的开箱即用的实施方案:

@Override
public String toString() {
  return ToStringBuilder.reflectionToString(this);
}

我现在正在寻找如何让它的输出更漂亮一点。 ReflectionStringBuilder似乎提供了更多自定义。具体来说,我喜欢这个:

@Override
public String toString() {
    StandardToStringStyle style = new StandardToStringStyle();
    style.setFieldSeparator(", ");
    style.setUseClassName(false);
    style.setUseIdentityHashCode(false);

    return new ReflectionToStringBuilder(this, style).toString();
}

输出如下:

[email=foo@gmail.com, age=16, createdDate=<null>, favoriteColor=blue, id=2]

答案 1 :(得分:9)

我只是使用我的IDE为我生成toString。如果我更改了代码,我会删除该方法并重新生成。