2010-10-15 70 views
28

我们有很多对象,我们想要实现一个简单的toString来输出对象的属性。其中一些属性本身可能是复杂的对象。什么是toString实现的最佳标准样式?

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

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

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

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

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

+3

提示:像Eclipse这样的IDE可以生成'toString()'。探索* Source *菜单。省时间! – BalusC 2010-10-16 02:15:10

+0

我认为一个真正的时间将是使用调试器。您可以随时中断执行,然后打印出您需要的关于可用对象的所有信息,获取堆栈轨迹,进行所需的更改,然后继续。所有这些都不会使用toString方法和痕迹膨胀你的代码。为什么麻烦,那么调试器会为你做所有事情,为了每一个对象? – Joony 2010-10-16 07:39:29

回答

20

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

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

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

还有与@添加标识的可能性,例如the default stylecommons-langToStringBuilder做这(使用它自己的例子):

[email protected][name=John Doe,age=33,smoker=false] 
+0

的日子里表现不佳,但是我想知道它是如何与各种框架和其他开源项目所使用的toString相互联系的? – Nicole 2010-10-15 22:58:30

+0

+1,很高兴知道eclipse默认会以这种格式生成'toString'方法。 – 2014-09-11 06:30:42

+0

我喜欢这个,尽管我喜欢的一个变体就像Java教程,它们不会在逗号后面加空格。虽然它更密集,但它具有能够看到字符串而无需添加引号的优势,如果这是有道理的。 Class.getSimpleName()很有用,而不是硬编码,因为基于数组的变量是Arrays.toString()。 – 2016-05-17 14:16:24

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" 
     } 
    ] 
} 
+9

我觉得'toString'应该真的是要返回一行,所以像json这样的东西可能会过于冗长。 – zigdon 2010-10-15 22:35:18

+0

@zigdon - 没有理由不能将它压缩成一行 – 2010-10-15 22:58:30

+0

没错,但对于大型嵌套对象,它仍然相当冗长。 – zigdon 2010-10-15 23:06:00

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也是一个干净的解决方案,特别是如果u要导入的JavaScript environbments

数据
25

我认为GuavaMoreObjects.toStringHelper()产生的格式是相当不错的,但它主要是刚刚好有你使用一些一致的格式:

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

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

有没有标准,或简单地只是一种风格的最佳做法?

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

如果您想为调试/日志记录toString()方法开发内部样式,那很好。但除非有这个要求,否则我不打扰。国际海事组织,这是可以更好地花在别处的努力。

1

没有直接回答这个问题,但是下面将初始开发过程中节省时间:

免责声明:Apache的共享库使用。

  1. Java > Editor > Templates中添加一个新的Eclipse模板,名为xreflect;下面添加到其模式 textarea的:

// ----------模板启动----------- // $ {:进口(ORG .apache.commons.lang.builder.EqualsBuilder,org.apache.commons.lang.builder.HashCodeBuilder,org.apache.commons.lang.builder.ReflectionToStringBuilder)} /* *(非Javadoc) * 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 ----------- // 
  • OKOK
  • 只要到一个Java类,类型xreflect的端部,并按下Ctrl键 + 空间自动填充等于( ),toString()和hashCode()方法。
  • +1

    不知何故,代码模板无法正确粘贴在这里....要复制它,请按下帖子下方的“编辑”并复制。 – KrishPrabakar 2016-01-07 08:36:35

    相关问题