当前位置: 首页 > news >正文

《Effective Java》解读第12条:始终要覆盖toString

文章目录

  • 始终要覆盖toString精华总结
    • 为什么要覆盖toString?
    • 一个好的toString是什么样的?
    • 如何实现一个好的toString?
    • 注意

始终要覆盖toString精华总结

提供一个好的toString实现,能让你的类用起来更加舒适,系统的调试和日志记录也更加容易。

为什么要覆盖toString?

  1. 默认实现无价值:Object类的默认toString实现(类名@散列码,如PhoneNumber@163b91)几乎不提供任何有价值的信息。
  2. 方便调试:开发者调试测试时,覆盖toString输出一些关键信息可以直观的了解对象状态。例如{Jenny= Phon Number@l63b91 }或 {Jenny = 707-867-5309 },你更愿意看到哪一个。
  3. 约定:toString 约定指出,“建议所有的子类都覆盖这个方法,返回的字符串应该是一个“简洁但信息丰富,并且易于人们阅读的表达形式”。

一个好的toString是什么样的?

  1. 包含所有关键信息: 返回值应该包含对象中所有“值得关注”的字段信息。
  2. 明确返回格式,在文档中进行说明,适合人阅读和机器去解析等。不过,一但指的格式后就要一直坚持,避免破坏依赖此格式的代码或数据。

如何实现一个好的toString?

  1. 手动拼接
@Override
public String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", city='" + city + '\'' +'}';
}
  1. 使用format
@Override
public String toString() {return String.format("Person{name='%s', age=%d, city='%s'}", name, age, city);
}
  1. 工具

用一些可以生成toString的第三方工具或开发工具自动生成。
例如lombok中:
在这里插入图片描述

例如idea中:
在这里插入图片描述
在这里插入图片描述

注意

  • 是否包含派生字段: 是否需要包含通过计算得到的字段,取决于它们是否对理解对象状态有帮助。

  • 性能考量: 在性能敏感的场景中,如果toString的调用非常频繁,且涉及大量字符串操作,需要考虑其性能影响。

  • 安全性: 绝对不要在toString中返回密码、密钥等敏感信息!

  • 无需覆盖的情况: 静态工具类、枚举类型(通常已经有很好的名称),或者父类已经提供了合适的toString实现时,可能不需要覆盖。

http://www.dtcms.com/a/605056.html

相关文章:

  • Linux C语言编译器 | C语言开发的最佳实践与工具选择
  • 网站备案电话没接产品设计分析案例
  • 112、23种设计模式之命令模式(20/23)
  • 第6章:空间查询与地理处理
  • 使用 Docker Compose 一键更新:深入理解 docker-compose pull 的适用场景
  • 一次在VS2022中使用sqlite数据库故障排查过程
  • Mailjet Setup Pitfall Guide: SPF, DKIM, DMARC Deliverability
  • 最好的企业网站电子商务网站建设考试重点
  • 大学新校区建设网站北京seo方法
  • SPI学习(QA)
  • 怎么用数据仓库来进行数据治理?
  • Linux_6:FTP云盘项目
  • Spring Boot spring.factories文件详细说明
  • 网站seo文章免费asp地方门户网站系统
  • 《信息存储与管理》逻辑串讲
  • dify TTS部署 GPT-SoVITS
  • kotlin中SharedFlow的简单使用
  • Kotlin 中的 inline 和 reified 关键字
  • 开封府景点网站及移动端建设情况精品资源共享课网站建设 碧辉腾乐
  • 战场目标检测:Faster R-CNN与RegNetX-800MF融合实现建筑物人员坦克车辆识别_2
  • 易语言黑月编译器:提升编程效率与性能优化 | 深入解析易语言开发中的工具应用与技巧
  • Vibe Coding - 从Vibe Coding到Spec Coding_AI编码范式的进化之路
  • 宣化网站建设青岛网站制作推广平台
  • 【多模态大模型面经】 BERT 专题面经
  • Node.js 开发实战:从入门到精通
  • 草莓病害智能识别与分类_Cascade-RCNN_HRNetV2p-W18-20e_COCO实现
  • 改造多模块!!无法使用三方依赖的异常处理
  • JMeter 自动化实战:自动生成文件并传参接口的完整方案
  • AutoSAR实战:RTA-OS Counters操作系统计数器详解
  • FCAF3D: Fully Convolutional Anchor-Free 3D Object Detection论文精读