可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
We have a lot of objects for which we like to implement a simple toString
to output attributes of the object. Some of these attributes may be complex objects themselves.
Is there any standard, or simply just a best practice for a style? I'm thinking something like:
[SimpleClassName] { prop1:value, prop2:value }
In which case a nested value would look like:
[SimpleClassName] { prop1:value, prop2:[NestedObject] { prop3:value}}
We are using Java but I find myself asking the same question in most languages!
回答1:
Personally, I find the mix of []
and {}
not so easy to get an immediate view of the hierarchy.
I like this format (and I've seen it being used in a number of places):
SimpleClassName[prop1=value, prop2=value]
SimpleClassName[prop1=value, prop2=NestedObject[prop3=value]]
There's also the possibility to add an identifier with @
, for example the default style for the commons-lang ToStringBuilder
does that (using its own example):
Person@182f0db[name=John Doe,age=33,smoker=false]
回答2:
I think the format produced by Guava's MoreObjects.toStringHelper() is pretty nice, but it's mainly just good to have some consistent format that you use:
public String toString() {
return Objects.toStringHelper(this)
.add("prop1", prop1)
.add("prop2", prop2)
.toString();
}
// Produces "SimpleClassName{prop1=foo, prop2=bar}"
回答3:
json syntax seems to fit pretty well since it was designed specifically to represent complex objects as strings
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"
}
]
}
回答4:
Not a direct answer to the question, however below would be a time saver during initial development:
Disclaimer: Apache Commons library is used.
- Add a new Eclipse template called
xreflect
in Java > Editor > Templates
; Add below into its pattern 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 ----------- //
- Give
OK
, OK
- Just go to the end of a Java class, type
xreflect
and press Ctrl + Space to autofill equals(), toString() and hashCode() methods automatically.
回答5:
Is there any standard, or simply just a best practice for a style?
No. The "best" output for a toString()
method is determined by what you want to use it for. Is it for serializing the object state in a form that allows it to be deserialized? Is it for creating debug messages? Is it for rendering the object for display to end-users?
If you want to develop an in-house style for your debug/logging toString()
methods, that's fine. But unless there was a requirement for this, I wouldn't bother. IMO, it is effort that could better be spent elsewhere.
回答6:
If your objects have something that might be useful as an identifier, I'd implement something like your second example:
[SimpleClassName:id] { prop1:value, prop2:[NestedObject:id] { prop3:value }}
Where the id
is whatever makes sense for that object to be an identifier - the name for the canonical Person
object, a primary key for an object from a database, etc.
回答7:
Since you asked about what other open source projects to, here's how jEdit does it, which is similar to Wouter's:
BufferChanging[what=BUFFER_CHANGING,source=org.gjt.sp.jedit.EditPane[active,global]]
回答8:
check out phps print_r($obj, true)
or also serialize() could work, dont know exactly for what its needed for.
jsons is also a clean solution, especially if u want to import the data in javascript environbments