美文网首页收集
重写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