前因:Object 类 手写toString 方法 太繁琐, 修改太麻烦
后果:利用 Apache Commons lang 自动化实现 toString
优势:①代码简洁 , 无须任何配置
② Model 属性变化 , 无需修改 toString
缺陷:安全性问题 , 反射私有属性值也会暴露 .
改进:利用ToStringBuilder弥补(通过 ReflectionToStringBuilder 子类 , 覆盖其 accept 方法来加以筛选 )
示例代码如下:
public String toString() {
return (new ReflectionToStringBuilder(this) {
protected boolean accept(Field f) {
return super.accept(f) && !f.getName().equals(“password”);
}
}).toString();
}
代码解释: toString 方法会跳过名为 password 属性
ToStringStyle 抽象类与设计模式
ToStringBuilder 封装 的三个属性 :
/**
* Current toString buffer, not null.
*/
private final StringBuffer buffer;//封装最终结果
/**
* The object being output, may be null.
*/
private final Object object;//toString 对象
/**
* The style of output to use, not null.
*/
private final ToStringStyle style;
关于类型ToStringStyle 在 ToStringBuilder 源码中的利用 ,
ToStringBuilder 类中所有的方法 append 都是通过调用属性 style 相应方法实现 .
ToStringStyle 设计模式 : 单例模式的衍生,返回子类对象
本文小结 :
①ToStringBuilder分而治之, 通过属性 ToStringBuilder 来分离功能的调用与实现 . ②子类达到多态的单例少见, 通过子类 StandardToStringStyle 提供了一个更为灵活的扩展 .
③具体实现大家可以参考 ReflectionToStringBuilder 源码 .
本文探讨了使用Apache Commons Lang自动化实现Object类的手写toString方法的简化与安全问题,通过引入ToStringBuilder类及其子类ReflectionToStringBuilder进行优化。详细介绍了如何避免私有属性泄露并提供示例代码,同时阐述了ToStringBuilder类的设计模式和其在代码分离与多态扩展方面的应用。最后,文章总结了自动化toString方法的优点与改进策略。
1万+

被折叠的 条评论
为什么被折叠?



