需求:在父类中重写toString()方法,当子类不重写toString()方法时,不会打印对象地址,而是打印子类参数的值。便于日志打印。
Apache 的 commons-lang3 的工具包里有一个 ToStringBuilder 类,可以实现上述需求:
但注意点:
- 子类使用lombok的@Data注解时,会覆盖父类toString()方法,父类重写的不会生效;
- 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;
}
网友评论