我们有很多对象,我们希望实现一个简单的toString
来输出对象的属性。其中一些属性本身可能是复杂的对象。
是否有任何标准,或仅仅是一种风格的最佳做法?我想的是:
[SimpleClassName] { prop1:value, prop2:value }
在这种情况下,嵌套值如下所示:
[SimpleClassName] { prop1:value, prop2:[NestedObject] { prop3:value}}
我们正在使用Java,但我发现自己在大多数语言中都提出同样的问题!
答案 0 :(得分:31)
我认为Guava的MoreObjects.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库。
xreflect
中添加名为Java > Editor > Templates
的新Eclipse模板;将以下内容添加到模式 textarea:// ---------- 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 ----------- //
OK
,OK
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环境中导入数据