toString():用于调试还是用于人类?
class Address { private enum Component { NUMBER, STREET, STATE, COUNTRY } private Map componentToValue = ...; }
我希望我的课程包含两种方法:
- 一个用于指示每个地址组件的值(因此,如果出现任何问题,我可以进行调试)。
- 一个以人类预期的forms返回地址:“1600 Amphitheatre Parkway Mountain View,CA 94043”。
Object.toString()的最佳实践是什么? 它主要用于#1还是#2? 是否有最佳实践来命名这些方法?
您会在SMS消息和HTML页面中以相同的方式格式化地址吗? 你会用英语,法语和日语以同样的方式格式化吗?
如果不是,那么您有答案:演示文稿不属于对象,而是属于显示对象的表示层。 除非该对象专门用于表示层,例如,如果它是HtmlI18nedAddress,则使用toString进行调试。
考虑Date
与SimpleDateFormat
。 Date
包含状态, 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。