怎样低成本做网站推广,中国互联网,建商城网站需要什么条件,电子商务网站推广实训心得解锁Python编程的无限可能#xff1a;《奇妙的Python》带你漫游代码世界
尽管 Object 类提供了 toString 方法的默认实现#xff0c;但它返回的字符串通常不是类的使用者想要看到的。默认返回的字符串格式是类名加上“”符号和哈希码的十六进制表示#xff0c;例如 PhoneNu…解锁Python编程的无限可能《奇妙的Python》带你漫游代码世界
尽管 Object 类提供了 toString 方法的默认实现但它返回的字符串通常不是类的使用者想要看到的。默认返回的字符串格式是类名加上“”符号和哈希码的十六进制表示例如 PhoneNumber163b91。然而toString 方法的合同要求返回一个简洁且信息丰富的字符串表示以便用户阅读。显然与“707-867-5309”相比“PhoneNumber163b91”并不具备太多的可读性和信息量。因此建议重写 toString 方法。
虽然重写 toString 不如重写 equals 和 hashCode 那样重要如【条目10】和【条目11】所述但提供一个良好的 toString 实现能让你的类更加易用且有助于调试。当对象被传递给 println、printf、字符串连接操作符或断言语句时toString 会自动调用。即使你不主动调用 toString其他人可能会。例如某个组件在记录错误消息时可能会包含对象的字符串表示。如果你没有重写 toString这些消息几乎是无用的。
为什么要重写 toString
如果你为 PhoneNumber 提供了一个好的 toString 方法那么生成有用的诊断消息会变得非常简单
System.out.println(Failed to connect to phoneNumber);不论你是否重写 toString程序员通常都会以这种方式生成诊断消息但只有当你重写了 toString这些消息才真正有用。toString 的好处不仅体现在类的实例本身也会反映在包含这些实例的对象上特别是集合。比如当你打印一个 Map 时哪一个更可读{JennyPhoneNumber163b91} 还是 {Jenny707-867-5309}
toString 方法应尽可能返回对象中的所有有趣信息。对于较大的对象或不适合字符串表示的对象可以返回摘要信息例如 Manhattan residential phone directory (1487536 listings) 或 Thread[main,5,main]。理想情况下字符串应该是自解释的。
格式化和文档化
实现 toString 时一个重要的决定是是否要在文档中指定返回值的格式。对于像电话号码这样的值类建议指定格式因为这可以为对象提供一种标准且明确的表示可以用于输入、输出以及持久化数据如 CSV 文件。如果你指定了格式最好提供匹配的静态工厂方法或构造函数以便程序员能够在对象和字符串表示之间轻松转换。许多 Java 平台库中的值类如 BigInteger、BigDecimal 和大多数包装类都采用了这种方法。
指定 toString 格式的缺点是一旦你指定了格式就必须长期坚持使用特别是当你的类被广泛使用时。如果将来修改了表示格式可能会导致程序崩溃或数据损坏。因此如果你不指定格式就保留了将来改进格式的灵活性。
无论是否指定格式都应该明确记录你的意图。如果指定格式要精确说明。例如下面是与【条目11】中的 PhoneNumber 类相匹配的 toString 方法文档
/*** 返回该电话号码的字符串表示。* 字符串由十二个字符组成格式为“XXX-YYY-ZZZZ”* 其中 XXX 是区号YYY 是前缀ZZZZ 是号码。* * 如果这三个部分中的任意一部分不够长会用前导零填充。* 例如如果号码值是 123字符串表示的最后四个字符将是“0123”。*/
Override
public String toString() {return String.format(%03d-%03d-%04d, areaCode, prefix, lineNum);
}如果你选择不指定格式则文档注释可能会类似如下
/*** 返回该药水的简短描述。表示的具体细节未指定并且可能会变化* 但通常的格式可能如下** [Potion #9: typelove, smellturpentine, lookindia ink]*/
Override
public String toString() {// 自定义实现
}这种文档确保了使用者在解析字符串表示时不能抱怨格式变化引发的问题。
提供访问器
无论是否指定 toString 格式都应提供程序化访问对象信息的途径。以 PhoneNumber 类为例应该提供获取区号、前缀和号码的访问器。如果没有这些访问器程序员不得不解析字符串来获取这些信息这不仅降低了性能还可能导致错误的系统。如果没有访问器即使你声明字符串格式是可变的它实际上仍然会成为一个事实上的 API。
特殊情况
不必在静态工具类【条目4】或大多数 enum 类型中编写 toString 方法因为 Java 已经为 enum 提供了一个很好的默认实现。不过在抽象类中如果子类共享相同的字符串表示形式则应该编写 toString 方法。例如许多集合实现继承了抽象集合类的 toString 实现。
此外Google 的开源 AutoValue 工具可以自动生成 toString 方法绝大多数 IDE 也提供了自动生成 toString 的功能。这些自动生成的方法对于了解类的字段内容非常有用但并不适合表示类的特定含义。例如电话号码类应该有一个标准的字符串表示而药水类则可以接受自动生成的 toString 方法。不过自动生成的 toString 方法仍然比继承自 Object 的默认实现好得多后者几乎无法提供任何有用信息。
总结
除非超类已经重写了 toString否则在你编写的每个实例类中都应重写 toString。这会让你的类更易用并有助于调试。toString 方法应返回对象的简洁、有用的描述并且格式美观。