始终要覆盖toString
始终要覆盖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的更多相关文章
- Java 始终要覆盖toString
java.lang.Object提供了toString方法的一个实现,它包含类的名称,以及一个“@”符号,接着是散列码的无符号十六进制表示法,例如“PhoneNumber@163b91”.在实际应用中 ...
- 第十条:始终要覆盖toString()方法
Object类提供的toString()方法如下: public String toString() { return getClass().getName() + "@" ...
- 第10条:始终要覆盖toString
java.lang.Object的toString方法的实现: public String toString() { return getClass().getName() + "@&quo ...
- EffectiveJava(10)覆盖equals是视情况覆盖toString
覆盖equals是视情况覆盖toString 1.toString返回字符串 className@163b91 -calssName 类的名称 @ @ 163b91 散列码的无符号十六进制表示法 2. ...
- 详解 方法的覆盖 —— toString() 与 equals()的覆盖
在学习本篇博文前,建议先学习完本人的博文--<详解 继承(上)-- 工具的抽象与分层> 在本人之前的博文中曾讲过"基类"的知识,那么,本篇博文中的主题--Object类 ...
- 创建学生类 有姓名 学校 和年龄 覆盖toString() 1放到集合ArrayList 然后 2在第2个位置插入1个学生信息 3判断 刘德华这个学生是否存在 存在就打出来, 4输出全部学生信息 直接打印对象
学生类 package com.lanxi.demo1; public class Student { //创建属性 姓名,学校,年龄 private String name; private Str ...
- 始终要重载toString
本文涉及到的概念 1.重载toString方法的意义 2.两个注意事项 1.重载toString方法的意义 重载toString,返回关于当前实例的描述信息.这在调试错误,打印实例信息时,可以带来 ...
- Effective java笔记(二),所有对象的通用方法
Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...
- Effective Java 读书笔记之二 对于所有对象都通用的方法
尽管Object是一个具体的类,但设计它主要是为了扩展.它的所有非final方法都有明确的通用约定.任何一个类在override时,必须遵守这些通用约定. 一.覆盖equals时请遵守通用的约定 1. ...
随机推荐
- a completely rewritten architecture of Hadoop cluster
https://www.ibm.com/developerworks/library/bd-yarn-intro/
- thinkphp3.2独立分组的建立
很简单,就是把默认的Home模块复制一份,放到Admin目录下,同时把namespace改成namespace Admin\Controller即可,配置项如下:
- mongodb学习之:副本集
前面一张介绍了主从模式,现在mongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模式.副本集不能在一台电脑上操作.需要准备3台电脑进行搭建.副本集就是mongoDB副本所组成的一个集群. ...
- go 客户端服务端通信
client.go package main import ( "bufio" "encoding/json" "fmt" "ha ...
- async函数学习笔记
含义 async函数是什么?一句话,它就是Generator函数的语法糖. const fs = require('fs') const readFile = function(fileName){ ...
- android4.3 蓝牙BLE编程
一.蓝牙4.0简介 蓝牙4.0标准包含两个蓝牙标准,准确的说,是一个双模的标准,它包含传统蓝牙部分(也有称之为经典蓝牙Classic Bluetooth)和低功耗蓝牙部分(Bluetooth Low ...
- HDU2512 一卡通大冒险 —— 第二类斯特林数
题目链接:https://vjudge.net/problem/HDU-2512 一卡通大冒险 Time Limit: 2000/1000 MS (Java/Others) Memory Lim ...
- 人生苦短之Python列表拷贝
列表拷贝的几种方法: 1.工厂函数 b=list(a) >>> a=[1,2,3,4] >>> b=list(a) >>> b [1, 2, ...
- Redis穿透问题解决方案
缓存穿透 缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有.这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空.这样请求就绕过缓存直接查数据库,这也是经常提的 ...
- codevs 4768跳石头
传送门 4768 跳石头 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 一年一度的“跳石头”比赛又要开始了! 这项比赛将在 ...