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

Java中toString方法的推荐实现方式

需求:

在父类中重写toString()方法,当子类不重写toString()方法时,不会打印对象地址,而是打印子类参数的值。便于日志打印。

Apache 的 commons-lang3 的工具包里有一个 ToStringBuilder 类,可以实现上述需求:

但注意点:

  1. 子类使用lombok的@Data注解时,会覆盖父类toString()方法,父类重写的不会生效;
  2. ToStringBuilder本质是通过反射来实现的,性能比较低,不如在子类上使用@Data注解;

一、Java中toString方法很重要


所有数据类都要重写toString方法。

Java类的toString方法决定了打印日志时该类对象的实际输出。日志的打印很重要,对于这一点工作一段时间的同学应该都是深有体会和赞同的。打印日志有很多讲究,打印哪些信息,打印格式,怎么打印更节省空间,怎么打印更利于解读和使用等等。

1、项目中一般都需要打印日志,所有实体的toString()方法都是用简单的"+",因为每"+" 一个就会 new 一个 String 对象,这样如果系统内存小的话会暴内存。使用ToStringBuilder就可以避免暴内存这种问题。

ToStringBuilder的reflectionToString方法:

  logger.info("请求数据:"+ToStringBuilder.reflectionToString(req));

2、ToStringBuilder在包 common-lang 中,主要用于一个类的格式化输出。ToStringBuilder类中的append方法可以向该类添加基本类型、数组和对象 ,只有添加的方法才会被toString方法输出。

        ToStringStyle类则是对输出的内容进行格式化。

二、利用Apache Commons Lang3更好的实现toString方法

导入commons lang3的jar包,或者添加commons lang3的maven依赖。

 <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.9</version>
</dependency>

三、ToStringBuilder的简单用法

和StringBilder类似,new一个ToStringBuilder对象,append方法添加属性名和属性值,最后toString。

推荐这样自己明确写出要打印的属性,有些敏感信息的属性可以不打印或者做匿名化处理

实例:

/**
   * 重写父类toString()方法,使得null值不进行打印,便于日志输出格式。
 */
public String toString() {

    /**
      * 通过反射来获取到  属性名和属性值  效率不高。
      * 并且子类若使用lombok注解的@Data注解时,会覆盖父类的toString方法。
      *
      * ToStringStyle.DEFAULT_STYLE:对象及其属性一行显示(默认值)
      * ToStringStyle.MULTI_LINE_STYLE:属性换行显示
      * ToStringStyle.NO_FIELD_NAMES_STYLE:不显示属性名,只显示属性值
      * ToStringStyle.SHORT_PREFIX_STYLE:对象名称简写
      * ToStringStyle.SIMPLE_STYLE:只显示属性
    */

    return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

    .append("Id",getId())

    .append("AdClientId",getAdClientId())

    .append("AdOrgId",getAdOrgId())

    .append("Posid",getPosid())

    .appen...
}

 

相关文章:

  • 构建系列之新一代利器Esbuild(上)
  • MIUI10国际版系统自定义字体设置办法
  • webpack 构建脚手架
  • 2022吴恩达机器学习课程——第三课(非监督学习)
  • PGP邮件加密软件的使用
  • LabVIEW如何减少下一代测试系统中的硬件过时 1
  • 全国职业院校技能大赛中职组网络安全竞赛试题 —文件包含漏洞与文件上传漏洞 (笔记文档)
  • java学习day64(乐友商城)Elasticsearch
  • Fabric.js 保存自定义属性
  • 【软件测试】测试人的懊恼,你要揭开的秘密复现bug......
  • 嵌入式C语言面向对象编程 --- 封装
  • 第十九章 webpack5项目搭建Vue-Cli(合并配置)
  • 设计好接口的36个锦囊
  • 我以为自己MySQL够牛逼了,直到看到了Alibaba的面试题
  • 解决vue代码不规范而出现的问题:Eslint修复
  • 2022年全国职业院校技能大赛中职组网络安全竞赛试题B模块 —辽宁省wirehark数据分析与取证hacker.pcapng数据包(flag)
  • 解决PageHelper版本不匹配,结果可能全部返回问题
  • 经验:工具在接口测试中发挥什么样的作用?
  • 2021年中职组“网络安全”赛项合肥市竞赛任务书
  • 会计毕业生的转行之路:坚持无畏,我是我自己的英雄