我们有很多对象,我们希望实现一个简单的
toString
来输出对象的属性。其中一些属性本身可能是复杂的对象。
是否有任何标准,或者只是某种风格的最佳实践?我在想类似的事情:
[SimpleClassName] { prop1:value, prop2:value }
在这种情况下,嵌套值将如下所示:
[SimpleClassName] { prop1:value, prop2:[NestedObject] { prop3:value}}
我们正在使用 Java,但我发现自己在大多数语言中都会问同样的问题!
我认为 Guava 的 MoreObjects.toStringHelper() 生成的格式非常好,但主要是有一些你使用的一致格式是好的:
public String toString() {
return Objects.toStringHelper(this)
.add("prop1", prop1)
.add("prop2", prop2)
.toString();
}
// Produces "SimpleClassName{prop1=foo, prop2=bar}"
就个人而言,我发现
[]
和{}
的混合不太容易立即了解层次结构。
我喜欢这种格式(并且我已经在很多地方看到过它的使用):
SimpleClassName[prop1=value, prop2=value]
SimpleClassName[prop1=value, prop2=NestedObject[prop3=value]]
还可以使用
@
添加标识符,例如 commons-lang 的默认样式 ToStringBuilder
就是这样做的(使用它自己的示例):
Person@182f0db[name=John Doe,age=33,smoker=false]
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"
}
]
}
免责声明:使用 Apache Commons 库。
xreflect
中添加一个名为
Java > Editor > Templates
的新Eclipse模板;将以下内容添加到其pattern 文本区域中:
// ---------- 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() 方法。
是否有任何标准,或者只是一种风格的最佳实践?不。
toString()
方法的“最佳”输出取决于您想要使用它的用途。是为了以允许反序列化的形式序列化对象状态吗?它是用于创建调试消息吗?是为了渲染对象以显示给最终用户吗?(请注意,在 Java 中,
toString()
方法可用于任一目的。在最终用户消息中使用
toString()
表示 / 会出现问题......但人们还是这样做。)如果您想为调试/日志记录
toString()
方法开发内部风格,那没问题。但除非有这样的要求,否则我不会打扰。 IMO,这种努力最好花在其他地方。
[SimpleClassName:id] { prop1:value, prop2:[NestedObject:id] { prop3:value }}
其中
id
是对该对象作为标识符有意义的任何内容 - 规范
Person
对象的名称、数据库中对象的主键等。
BufferChanging[what=BUFFER_CHANGING,source=org.gjt.sp.jedit.EditPane[active,global]]