美文网首页收集
重写toString方法的工具类—ToStringBuilder

重写toString方法的工具类—ToStringBuilder

作者: 小胖学编程 | 来源:发表于2021-10-12 15:23 被阅读0次

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

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

但注意点:

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

引入依赖:

<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.4</version>
</dependency>

代码实现:

public abstract class BaseDto {

    /**
     * 重写父类toString()方法,使得null值不进行打印,便于日志输出格式。
     */
    @Override
    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 ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) {
            @Override
            public ToStringBuilder append(String fieldName, Object obj) {
                //当属性为null时,不进行打印输出
                if (obj != null) {
                    return super.append(fieldName, obj);
                }
                return this;
            }
        }.toString();
    }
}

子类:

//@Data 注解将会覆盖父类的toString()
@Data
public class User extends BaseDto {

    private String name;
    private int age;
}

文章参考

关于 toString 方法的重写工具 ToStringBuilder

相关文章

网友评论

    本文标题:重写toString方法的工具类—ToStringBuilder

    本文链接:https://www.haomeiwen.com/subject/hghqoltx.html