toString():用于调试还是用于人类?

class Address { private enum Component { NUMBER, STREET, STATE, COUNTRY } private Map componentToValue = ...; } 

我希望我的课程包含两种方法:

  1. 一个用于指示每个地址组件的值(因此,如果出现任何问题,我可以进行调试)。
  2. 一个以人类预期的forms返回地址:“1600 Amphitheatre Parkway Mountain View,CA 94043”。

Object.toString()的最佳实践是什么? 它主要用于#1还是#2? 是否有最佳实践来命名这些方法?

您会在SMS消息和HTML页面中以相同的方式格式化地址吗? 你会用英语,法语和日语以同样的方式格式化吗?

如果不是,那么您有答案:演示文稿不属于对象,而是属于显示对象的表示层。 除非该对象专门用于表示层,例如,如果它是HtmlI18nedAddress,则使用toString进行调试。

考虑DateSimpleDateFormatDate包含状态, SimpleDateFormat返回多个表示。

我会说第一个。 数据格式化不应硬编码到对象的ToString()函数中。

我这样看:我尝试使我的ToString()输出数据可以被匹配的Parse(字符串数据)函数读取(如果该函数实际存在与否并不重要)。 因此,在这种情况下,如果您需要特定格式,请编写特定函数,并将通用数据转储例程保留为ToString()。

我通常使用Apache Commons ToStringBuilder http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/builder/ToStringBuilder.html ,只包含我认为绝对需要调试的部分。

您可以从动态配置的某些调试属性中读取:

 @Override public String toString() { if(debug) { return debugAddrString() } return normalAddrString(); } 

ToString通常只应用于调试信息。 请记住,您正在覆盖Object上的方法; 是否在概念上准确地对Object引用进行方法调用返回一个人类可读的地址? 在某些情况下,根据项目,这实际上可能有意义,但对我来说听起来有点奇怪。 我会实现一个新方法。

另外需要注意的是,大多数现代IDE使用ToString方法在检查对象时打印有关对象的调试信息。

您可以做的一件事是使用Debug标志来根据需要更改它:

 public String toString(boolean debug) { if (debug) return debugStringVersion; else return humanVersion; } public String toString() { return toString(Util.DEBUG); } 

当然,这假设您有一个实用程序类,其中包含调试标志。

Javadoc说:

通常,toString方法返回一个“文本表示”此对象的字符串。 结果应该是简洁但信息丰富的表示,便于人们阅读。

所以我选择2。