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

目录

Java中toString方法很重要

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

ToStringBuilder的简单用法

toString样式ToStringStyle

DEFAULT_STYLE (常用)

MULTI_LINE_STYLE 

NO_FIELD_NAMES_STYLE 

SHORT_PREFIX_STYLE

SIMPLE_STYLE

NO_CLASS_NAME_STYLE

JSON_STYLE

IntelliJ IDEA设置toString生成模板,快速生成ToStringBuilder方式的toString方法

利用模板方法的设计模式实现toString更好的继承性


Java中toString方法很重要

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

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

总之一句话,打印日志很重要,Java类的toString方法很重要。

利用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>

官网地址:http://commons.apache.org/proper/commons-lang/

在线API地址:http://commons.apache.org/proper/commons-lang/javadocs/api-3.9/index.html

主要关注org.apache.commons.lang3.builder包下的两个类
ToStringBuilder 协助实现Object.toString()方法。
ToStringStyle 控制ToStringBuilder的字符串格式。

ToStringBuilder的简单用法

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

推荐这样自己明确写出要打印的属性,有些敏感信息的属性可以不打印或者做匿名化处理,如个人数据手机号等。

示例:

    @Override
    public String toString() {
        return new ToStringBuilder(this)
                .append("id", id)
                .append("name", name)
                .append("price", price)
                .append("pic", pic)
                .append("createtime", createtime)
                .append("detail", detail)
                .toString();
    }

toString样式ToStringStyle

ToStringBuilder构造函数传入ToStringStyle中样式的值指定toString样式,如ToStringBuilder(this, ToStringStyle.DEFAULT_STYLE),是使用默认样式。目前版本样式种类如下:

DEFAULT_STYLE (常用)

默认toString样式, 输出示例:Person@182f0db[name=John Doe,age=33,smoker=false]

MULTI_LINE_STYLE 

多行toString样式, 输出示例:

 Person@182f0db[
   name=John Doe
   age=33
   smoker=false
 ]


 

NO_FIELD_NAMES_STYLE 

无字段名的toString样式, 输出示例:

Person@182f0db[John Doe,33,false]

SHORT_PREFIX_STYLE

简短前缀的toString样式, 输出示例: 

Person[name=John Doe,age=33,smoker=false]

SIMPLE_STYLE

简单的toString样式, 输出示例:

John Doe,33,false

NO_CLASS_NAME_STYLE

没有类名的toString样式, 输出示例:

[name=John Doe,age=33,smoker=false]

JSON_STYLE

json字符串格式的toString样式, 输出示例:

 {"name": "John Doe", "age": 33, "smoker": true}


 

IntelliJ IDEA设置toString生成模板,快速生成ToStringBuilder方式的toString方法

按下快捷键Alt+Insert,点击toString(),打开生成toString方法的弹窗。

toString方法默认模板是String字符串拼接的方式实现,点击settings,选择其他toString方法模板或自定义模板,这里选择使用ToStringBuilder的模板就可以了。

点击ok,再选择字段点击ok就自动生成如上简单示例中的toString方法。

利用模板方法的设计模式实现toString更好的继承性

让子类可以更好的继承和打印自己的属性,可以采用模板方法的设计模式实现。在父类中新建一个createToStringBuilder(可以是其他名称,但是最好不要以get开头)的保护方法,创建和返回一个ToStringBuilder对象,包含当前类的所有属性;重写toString方法,调用this.createToStringBuilder().toString()。子类继承父类,只要重写createToStringBuilder方法,调用父类的createToStringBuilder方法继续append添加子类的属性即可,不必再次重写toString方法。

示例:

父类BaseResponse中:

    /**
     * 构造ToStringBuilder
     *
     * @return ToStringBuilder
     */
    protected ToStringBuilder createToStringBuilder() {
        return new ToStringBuilder(this, ToStringStyle.DEFAULT_STYLE)
                .append("retCode", retCode)
                .append("msg", msg);
    }

    @Override
    public String toString() {
        return this.createToStringBuilder().toString();
    }

子类GetUserInfoResponse继承BaseResponse,重写createToStringBuilder方法:

    @Override
    protected ToStringBuilder createToStringBuilder() {
        return super.createToStringBuilder().append("user", user);
    }

结束语:有很多好的开源框架值得我们学习和使用,其中Apache Commons是佼佼者,使用开源框架和学习他们的各种实现,可以使你更快的进步。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值