toString实现的最佳标准样式是什么?

时间:2010-10-15 22:15:21

标签: java php javascript actionscript tostring

我们有很多对象,我们希望实现一个简单的toString来输出对象的属性。其中一些属性本身可能是复杂的对象。

是否有任何标准,或仅仅是一种风格的最佳做法?我想的是:

[SimpleClassName] { prop1:value, prop2:value }

在这种情况下,嵌套值如下所示:

[SimpleClassName] { prop1:value, prop2:[NestedObject] { prop3:value}}

我们正在使用Java,但我发现自己在大多数语言中都提出同样的问题!

8 个答案:

答案 0 :(得分:31)

我认为GuavaMoreObjects.toStringHelper()生成的格式非常好,但是使用一致的格式主要是好的:

public String toString() {
  return Objects.toStringHelper(this)
      .add("prop1", prop1)
      .add("prop2", prop2)
      .toString();
}

// Produces "SimpleClassName{prop1=foo, prop2=bar}"

答案 1 :(得分:26)

就个人而言,我发现[]{}的混合并不容易立即查看层次结构。

我喜欢这种格式(我已经看到它在很多地方使用过):

SimpleClassName[prop1=value, prop2=value]
SimpleClassName[prop1=value, prop2=NestedObject[prop3=value]]

还可以添加@的标识符,例如the default style ToStringBuilder commons-lang的标识符(使用自己的示例):

Person@182f0db[name=John Doe,age=33,smoker=false]

答案 2 :(得分:4)

json语法看起来非常合适,因为它专门用于将复杂对象表示为字符串

Person = {
    "firstName": "John",
    "lastName": "Smith",
    "age": 25,
    "address": 
    {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": "10021"
    },
    "phoneNumber": 
    [
        {
            "type": "home",
            "number": "212 555-1234"
        },
        {
            "type": "fax",
            "number": "646 555-4567"
        }
    ]
}

答案 3 :(得分:3)

不是这个问题的直接答案,但是下面的内容可以节省时间:

免责声明:使用Apache Commons库。

  1. xreflect中添加名为Java > Editor > Templates的新Eclipse模板;将以下内容添加到模式 textarea:
  2. // ---------- template start ----------- //
    ${:import(org.apache.commons.lang.builder.EqualsBuilder,org.apache.commons.lang.builder.HashCodeBuilder,org.apache.commons.lang.builder.ReflectionToStringBuilder)}
    /*
     * (non-Javadoc)
    * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(
            final Object pObj) {
        return EqualsBuilder.reflectionEquals(this, pObj);
    }
    
    /*
     * (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return ReflectionToStringBuilder.toString(this);
    }
    
    /*
     * (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this);
    }
    // ---------- template end ----------- //
    
    1. 提供OKOK
    2. 只需转到Java类的末尾,键入xreflect并按 Ctrl + Space 自动填充equals(),toString()和hashCode( )方法自动。

答案 4 :(得分:2)

  

是否有任何标准,或仅仅是一种风格的最佳实践?

没有。 toString()方法的“最佳”输出取决于您要使用它的内容。它是否以允许反序列化的形式序列化对象状态?是用于创建调试消息吗?它是否用于将对象呈现给最终用户?

如果您想为调试/记录toString()方法开发内部样式,那很好。但除非有这个要求,否则我不会打扰。国际海事组织,这项工作可以更好地用于其他地方。

答案 5 :(得分:0)

如果你的对象有一些可能有用的标识符,我会实现类似你的第二个例子:

[SimpleClassName:id] { prop1:value, prop2:[NestedObject:id] { prop3:value }}

id是该对象有意义的标识符 - 规范Person对象的名称,数据库中对象的主键等。

答案 6 :(得分:0)

既然你问过其他开源项目是什么,这就是jEdit的做法,这与Wouter的类似:

BufferChanging[what=BUFFER_CHANGING,source=org.gjt.sp.jedit.EditPane[active,global]]

答案 7 :(得分:0)

查看phps print_r($ obj,true) 或者serialize()可以工作,不知道它需要什么。 jsons也是一个干净的解决方案,特别是如果你想在javascript环境中导入数据