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

mP.*_*mP. 17 java class-design

让我们面对它编写好的toString消息是一个无聊的杂乱的工作需要完成,因为它可以真正有助于调试或记录中的检查.

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

  • 转储属性应该带标签.

    name = mP country =澳大利亚......

  • 应该可以跳过某些默认值.

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

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

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

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

    *name = mP state ="新南威尔士"

  • 当添加列表,地图或集合时,应该遵守有关引用字符串的规则,使用集合分隔符等.请不要只转储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();
Run Code Online (Sandbox Code Playgroud)

当然会导致"name ="Australia"数字= 1,2,3;

rip*_*234 20

Apache ToStringBuilder有一个很好的开箱即用的实现:

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

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

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

    return new ReflectionToStringBuilder(this, style).toString();
}
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

[email=foo@gmail.com, age=16, createdDate=<null>, favoriteColor=blue, id=2]
Run Code Online (Sandbox Code Playgroud)


Mic*_*ker 9

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

  • 你可以做得比生成toStrings更好,所以为什么不进一步去写一个有意义的toString而不是倾倒每一个字段.这种方法有很多弱点并不好笑.想象一下,如果String.toString采用这种方法,我们会有一些丑陋的char []转储一个带有单个字符转储的数组. (3认同)