始终要覆盖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. linux socket详解

    1 linux socket编程的固定模式 server端,bind.listen.accept client端,connect client端和server端之间的一次通信: client端,wri ...

  2. ubuntun16.04不支持intel的最新网卡,升级到17.10后解决

    新买的神舟战神电脑.装了ubuntu16.04版本.但是安装后无线网卡无法使用无线网卡型号:是intel的一款网卡02:00.0 Network controller [0280]: Intel Co ...

  3. Android项目中JNI技术生成并调用.so动态库实现详解

    生成 jni方式有两种:一种是通过SWIG从C++代码生成过度的java代码:另一种是通过javah的方式从java代码自动生成过度的C++代码.两种方式下的步骤流程正好相反. 第一种方式:由于需要配 ...

  4. UVA10561 Treblecross —— SG博弈

    题目链接:https://vjudge.net/problem/UVA-10561 题意: 两个人玩游戏,轮流操作:每次往里面添加一个X,第一个得到XXX的获胜. 题解: 详情请看<训练指南&g ...

  5. MySQL登陆及配置

    一.mysql用户登录 mysql –u用户名 [–h主机名或者IP地址] –p密码 说明:用户名是你登录的用 户,主机名或者IP地址为可选项,如果是本地连接则不需要,远程连接需要填写,密码是对应用户 ...

  6. 【mysql】mysql innodb 配置详解

    MySQL innodb 配置详解 innodb_buffer_pool_size:这是InnoDB最重要的设置,对InnoDB性能有决定性的影响.默认的设置只有8M,所以默认的数据库设置下面Inno ...

  7. mongodb压缩——snappy、zlib块压缩,btree索引前缀压缩

    MongoDB 3.0 WiredTiger Compression and Performance One of the most exciting developments over the li ...

  8. linguistic相关

    Knowing a word means knowing both its sound and its meaning, while being able to use a word requires ...

  9. 【CQ18高一暑假前挑战赛5】标程

    [A:暴力] #include<bits/stdc++.h> using namespace std; ; int a[maxn],vis[maxn],N,M; int main() { ...

  10. codevs 4768跳石头

    传送门 4768 跳石头  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold  题目描述 Description 一年一度的“跳石头”比赛又要开始了! 这项比赛将在 ...