建议:始终要覆盖toString。

虽然java.lang.Object提供了toString方法的一个实现,但他返回的字符串通常并不是类的用户所期望看到的。它包含类的名称,以及一个“@”符号,接着是散列码的无符号十六进制表示法,例如“PhoneNumber@163b91”。toString的通用约定指出,被返回的字符串应该是一个“简洁地,但信息丰富,并且易于阅读的表达形式”【JavaSE6】。尽管有人认为他还算不上是信息丰富的。toString的约定进一步指出,“建议所有的子类都覆盖这个方法。”,这是一个很好地建议,真的!

在实际应用中,toString方法应该返回对象中包含的所有值得关注的信息。如果对象太大,或者对象中包含的状态信息难以用字符串来表达,这样做就有点不切实际。在这种情况下,toString应该返回一个摘要信息,例如“Manhattan white pages(1487536 listings)”或者“Thread[main , 5 , main]”。理想情况下,字符串应该是自描述的(self-explanatory),(Thread例子不满足这样的要求。)

在实现toString的时候,必须要做出一个很重要的决定:是否在文档中指定返回值的格式。对于值类(value class),比如电话号码类、矩阵类,也建议这么做。指定格式的好处是,他可以被用做一种标准的、明确地、适合人约定的对象表示法。这种表示法可以用于输入和输出,以及用在永久的适合于人类阅读的数据对象中,例如XML文档。如果你指定了格式,最好再提供一个相匹配的静态工厂或者构造器,以便程序员可以很容易的在对象和它的字符串表示法之间来回转换。Java平台类库中的许多值类都采用了这种方法,包括BigInteger、BigDecimal和绝大多数的基本类型包装类(boxed primitive class)。

指定toString返回值的格式也有不足之处:如果这个类已经被广泛使用,一旦指定格式,就必须始终如一地坚持这种格式。程序员将会编写相应的代码来解析这种字符串表示法,产生字符串表示法,以及把字符串表示法嵌入到持久的数据库中。如果将来发型版本中改变了这种表示法,就会破坏他们的代码和数据,他们当然会抱怨。如果不指定格式,就可以保留灵活性,便于在将来的发行版本中增加信息、或者改进格式。

无论你是否决定指定格式,都应该在文档中明确的表明你的意图。如果你要指定格式,则应该严格地这样去做(写注释)。

无论是否指定格式,都为toString返回值中包含的所有信息,提供一种编程式的访问途径。如果不这么做,就会迫使那些需要这些信息的程序员不得不自己去解析这些字符串。除了降低了程序的性能,使得程序员们去做这些不必要的工作之外,这个解析过程也很容易出错,会导致系统不稳定,如果格式发生变化,还会导致系统崩溃。如果没有提供这些访问方法,即使你已经指明了字符串的格式是可以变化的,这个字符串格式也成了事实上的API。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值