toString 实现的最佳标准样式是什么? [已关闭]

问题描述 投票:0回答:8

我们有很多对象,我们希望实现一个简单的

toString
来输出对象的属性。其中一些属性本身可能是复杂的对象。

是否有任何标准,或者只是某种风格的最佳实践?我在想类似的事情:

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

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

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

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

java php javascript actionscript tostring
8个回答
35
投票

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

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

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

31
投票

就个人而言,我发现

[]
{}
的混合不太容易立即了解层次结构。

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

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

还可以使用

@
添加标识符,例如 commons-lang 的默认样式 ToStringBuilder
 就是这样做的(使用它自己的示例):

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

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
投票
不是问题的直接答案,但以下内容可以在初始开发过程中节省时间:

免责声明:使用 Apache Commons 库。

  1. 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 ----------- //

  1. OK
    OK
    
    
  2. 只需转到 Java 类的末尾,输入
  3. xreflect
     并按 
    Ctrl + Space 即可自动填充 equals()、toString() 和 hashCode() 方法。

1
投票
是否有任何标准,或者只是一种风格的最佳实践?

不。

toString()

 方法的“最佳”输出取决于您想要使用它的用途。是为了以允许反序列化的形式序列化对象状态吗?它是用于创建调试消息吗?是为了渲染对象以显示给最终用户吗?

(请注意,在 Java 中,

toString()

 方法可用于任一目的。在最终用户消息中使用 
toString()
 表示 / 会出现问题......但人们还是这样做。)

如果您想为调试/日志记录

toString()

 方法开发内部风格,那没问题。但除非有这样的要求,否则我不会打扰。 IMO,这种努力最好花在其他地方。


0
投票
如果您的对象具有可能用作标识符的内容,我会实现类似于您的第二个示例的内容:

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

其中

id

 是对该对象作为标识符有意义的任何内容 - 规范 
Person
 对象的名称、数据库中对象的主键等。


0
投票
既然你问了还有哪些其他开源项目,这里是 jEdit 的做法,与 Wouter 的类似:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.