java.lang.Object的toString方法的实现:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
这通常不是用户期望看到的,它包含类名称,一个“@”符号,以及散列码的无符号十六进制表示法。toString通用约定指出,被返回的字符串应该是一个“简洁的,但信息丰富,并且易于阅读的表达形式”,进一步的约定指出,建议所有的子类都覆盖这个方法。
在实际应用中,toString方法应该返回对象中包含的所有值得关注的信息,如果对象太大或者对象中包含的状态信息难以用字符来表达,这样做就有点不切实际了。在这种情况下toString方法应该返回一个摘要信息。提供好的toString方法可以使类用起来更加舒适,当对象被传递给println、printf、字符串联操作符(+)以及assert或者被调试器打印出来时,toString方法会被自动调用,产生有用的诊断信息也会非常容易:
public class TFyAj1 {
public String CBh;
public String CAh;
public String getCBh() { return CBh; }
public void setCBh(String cBh) { CBh = cBh; }
public String getCAh() { return CAh; }
public void setCAh(String cAh) { CAh = cAh; }
}
public class TFyAj2 {
public String CBh;
public String CAh;
public String getCBh() { return CBh; }
public void setCBh(String cBh) { CBh = cBh; }
public String getCAh() { return CAh; }
public void setCAh(String cAh) { CAh = cAh; }
/*
* Returns 案号
*/
@Override public String toString() { return "案号:" + CAh; }
}
在实现toString方法时,应该做出一个重要的决定,是否在文档中指定返回值的格式,对于值类也建议这么做,因为这可以被用做一种标准的、明确的、适合人阅读的对象表示法。这种表示法可以用于输入和输出以及用在永久的适合于人类阅读的数据对象中,如xml文档。如果指定了格式,那么就最好再提供一个相匹配的静态工厂方法或者构造器,以便程序员可以很容易地在对象和它的字符串表示法之间来回切换。Java平台类库中的许多值类都采用这种做法,包括BigInteger、BigDecimal和绝大多数的基本类型包装类(boxed primitive class)。
指定格式也有其不足的地方,就是限制了toString()的灵活性,一旦指定了格式就必须坚持这种格式,程序员会编写相应的代码来解析这种字符串表示法,产生字符串表示法,以及把字符串表示嵌入到持久的数据中。如果将来的版本中改变了这种做法就会破坏他们的代码和数据。如果不指定格式的话就可以保留灵活。无论是否决定指定格式,都应该在文档中明确地表明你的意图。如果要指定格式必须严格遵守这条约定,如果不指定格式那么文档注释部分也应该有指示的指示信息。对于那些依赖于格式的细节进行编程或者产生永久数据的程序员在读到这行注释后,一旦格式改变就得自己承担后果了。
无论是否指定格式,都为toString返回值中包含的所有信息,提供一种编程式的访问途径。(get?)如果不这么做,就会迫使那些需要这些信息的程序员不得不自己去解析这些字符串。降低了程序的性能,使得程序员去做这些不必要的工作,而且解析过程也很容易出错,会导致系统不稳定,如果格式发生变化还会导致系统崩溃。如果没有提供这些方法,即使你已经指明字符串格式是可以变化的,这个字符串格式也成了事实上的API。
总结:
1、toString方法应该包含对象中所有值得关注的信息。
2、无论你是否决定指定格式,都应该在文档中明确地表明你的意图:
1)如果你要指定格式,则应该严格地这样去做。
2) 如果你决定不指定格式,那么文档注释部分也应该有指示信息。
3、无论是否指定格式,都为toString返回值中包含的所有信息,提供一种编程式的访问途径。