始终要覆盖toString

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

  虽然遵守toString的约定并不像遵守equals和hashCode的约定那么重要,但是,提供好的toString实现可以使类用起来更舒适。当对象被传递给println、print、字符串联操作符(+)以及assert或者被调试器打印出来时,toString方法都会被自动调用。(Java 1.5发行版本在平台增加了printf方法,还提供了好的String.format的先关方法。)

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

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

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

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

  对于那些依赖格式细节编程或者产生永久数据的程序员,在读到注释之后,一旦格式被改变,则只能自己承担结果。

  无论是否指定格式,都为toString返回值中包含所有信息,提供一种编程式的访问途径。

始终要覆盖toString的更多相关文章

  1. Java 始终要覆盖toString

    java.lang.Object提供了toString方法的一个实现,它包含类的名称,以及一个“@”符号,接着是散列码的无符号十六进制表示法,例如“PhoneNumber@163b91”.在实际应用中 ...

  2. 第十条:始终要覆盖toString()方法

    Object类提供的toString()方法如下: public String toString() {    return getClass().getName() + "@" ...

  3. 第10条:始终要覆盖toString

    java.lang.Object的toString方法的实现: public String toString() { return getClass().getName() + "@&quo ...

  4. EffectiveJava(10)覆盖equals是视情况覆盖toString

    覆盖equals是视情况覆盖toString 1.toString返回字符串 className@163b91 -calssName 类的名称 @ @ 163b91 散列码的无符号十六进制表示法 2. ...

  5. 详解 方法的覆盖 —— toString() 与 equals()的覆盖

    在学习本篇博文前,建议先学习完本人的博文--<详解 继承(上)-- 工具的抽象与分层> 在本人之前的博文中曾讲过"基类"的知识,那么,本篇博文中的主题--Object类 ...

  6. 创建学生类 有姓名 学校 和年龄 覆盖toString() 1放到集合ArrayList 然后 2在第2个位置插入1个学生信息 3判断 刘德华这个学生是否存在 存在就打出来, 4输出全部学生信息 直接打印对象

    学生类 package com.lanxi.demo1; public class Student { //创建属性 姓名,学校,年龄 private String name; private Str ...

  7. 始终要重载toString

    本文涉及到的概念 1.重载toString方法的意义 2.两个注意事项   1.重载toString方法的意义 重载toString,返回关于当前实例的描述信息.这在调试错误,打印实例信息时,可以带来 ...

  8. Effective java笔记(二),所有对象的通用方法

    Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...

  9. Effective Java 读书笔记之二 对于所有对象都通用的方法

    尽管Object是一个具体的类,但设计它主要是为了扩展.它的所有非final方法都有明确的通用约定.任何一个类在override时,必须遵守这些通用约定. 一.覆盖equals时请遵守通用的约定 1. ...

随机推荐

  1. bc - An arbitrary precision calculator language

    bc(1) General Commands Manual bc(1) NAME bc - An arbitrary precision calculator language SYNTAX bc [ ...

  2. HDFS被设计成能够在一个大集群中跨机器可靠地存储超大文件

    HDFS被设计成能够在一个大集群中跨机器可靠地存储超大文件.它将每个文件存储成一系列的数据块,除了最后一个,所有的数据块都是同样大小的.为了容错,文件的所有数据块都会有副本.每个文件的数据块大小和副本 ...

  3. react遇到的各种坑

    标签里用到<label for>的,for 要写成htmlFor 标签里的class要写成className 组件首字母一定要大写 单标签最后一定要闭合 如果html里要空格转义, 注意不 ...

  4. view定位

  5. LinuxMail发送邮件

    使用Mail命令发送邮件: 可如下所示 echo "hello,echo"|mail -s "echo" justin@51cto.com #!/bin/bas ...

  6. SpringSecurity加密Salt

    Spring Security 加密,默认加salt的输出为:password{salt};然后再对这个加salt后的密码加密存储. 源码如下: protected String mergePassw ...

  7. Codeforces Round #198 (Div. 2) E. Iahub and Permutations —— 容斥原理

    题目链接:http://codeforces.com/contest/340/problem/E E. Iahub and Permutations time limit per test 1 sec ...

  8. Spring MVC 注解json 配置

    1.首先在pom.xml中添加依赖jar包 <dependency>        <groupId>org.codehaus.jackson</groupId>  ...

  9. easyui tree 树形节点 formatter 渲染不起作用

    接了个需求,需要对一个树形列表进行重新渲染,在进行渲染的过程中发现树形节点的formatter 属性无法生效.经反复测试,发现在外部环境中正常,但在项目环境中始终无效.最终发现问题出在 easyui ...

  10. centos 安装配置kettle

    安装JDK1.8: step1 下载JDK1.8 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...