始终要重载toString
2017-03-16 21:25 ttylinux 阅读(571) 评论(0) 编辑 收藏 举报本文涉及到的概念
1.重载toString方法的意义
2.两个注意事项
1.重载toString方法的意义
重载toString,返回关于当前实例的描述信息。这在调试错误,打印实例信息时,可以带来有意义的信息。如果不重载,使用默认的toString实现,返回的含义不清楚。重载toString的目的是,给使用当前实例的客户端返回有意义的信息。
2.两个注意事项
a.重载toString时,如果返回的字符串是指定格式的,那么,要添加注释说明该格式。并且,在以后的实现中,不要轻易去修改该格式,因为客户端代码有可能依赖该格式来写代码,修改格式,会影响客户端代码,造成客户端代码不可用。
b.如果不指定返回的字符串的格式,那么,也要在注释中说明。这样,你在以后就可以修改返回的字符串格式,对于格式发生改变带来的影响,你不用去考虑。
此外,toString返回值中包含的所有信息,我们要给客户端提供一种访问途径(提供一些get方法),避免客户端代码去解析toString返回值中的信息。如果没有为客户端提供这些访问方法(用来获取toString返回值中包含的所有信息),那么,客户端代码会尝试去解析toString返回值的信息,这样,这个toString返回值的格式也成了事实上的API。
一个例子:
import java.util.*; public final class PhoneNumber { private final short areaCode; private final short prefix; private final short lineNumber; public PhoneNumber(int areaCode, int prefix, int lineNumber) { rangeCheck(areaCode, 999, "area code"); rangeCheck(prefix, 999, "prefix"); rangeCheck(lineNumber, 9999, "line number"); this.areaCode = (short) areaCode; this.prefix = (short) prefix; this.lineNumber = (short) lineNumber; } private static void rangeCheck(int arg, int max, String name) { if (arg < 0 || arg > max) throw new IllegalArgumentException(name + ": " + arg); } /** * returns a brief description of this potion */ @Override public String toString() { return String.format("(%03d) %03d-%04d", areaCode, prefix, lineNumber); } @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof PhoneNumber)) return false; PhoneNumber pn = (PhoneNumber) o; return pn.lineNumber == lineNumber && pn.prefix == prefix && pn.areaCode == areaCode; } // Broken - no hashCode method! // A decent hashCode method - Page 48 @Override public int hashCode() { int result = 17; result = 31 * result + areaCode; result = 31 * result + prefix; result = 31 * result + lineNumber; return result; } public static void main(String[] args) { Map<PhoneNumber, String> m = new HashMap<PhoneNumber, String>(); m.put(new PhoneNumber(707, 867, 5309), "Jenny"); System.out.println(m.get(new PhoneNumber(707, 867, 5309))); System.out.println(new PhoneNumber(707, 867, 5309)); } }
输出结果:
Jenny
(707) 867-5309
版权声明:
作者:ttylinux
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。