ToStringBuilder和ToStringStyle(覆盖每个实体的 toString 方法)
来源:互联网 发布:阿里云推送白名单 编辑:程序博客网 时间:2024/06/05 13:32
今天系统要打印日志,发现所有实体的toString()方法 都用的是简单的"+",因为每"+" 一个就会 new 一个 String 对象,
这样如果系统内存小的话会暴内存(前提系统实体比较多)。
1.私有变量
ToStringStyle defaultStyle;缺省的Style,缺省赋值为ToStringStyle.DEFAULT_STYLE。
StringBuffer buffer;用于连接所有内容的SB。
Object object;需要输出的对象。
ToStringStyle style;所使用的Style。
2.构造函数
ToStringBuilder的构造函数必须最少包含需要输出的对象,另外也可以在构函中指定buffer和style。下面只描述全参数的处理过程:
如果buffer为空,则新生成一个大小为512的StringBuffer。
利用参数对object变量赋值。
利用style的appendStart输出开始标记。
3.append方法
append方法可以把参数中的原始类型或对象类型连接到该对象的buffer中。append方法利用了Decorator模式,所以最后都返回本对象。
3.1 单个原始类型变量和Object变量的append方法
这种方法的参数为一个原始类型变量或Object变量,但参数中可能含有FieldName,也可以没有。
boolean利用style的对应append方法进行输出,其中如果没提供FieldName,置null。
byte,char,double,float,int,long,Object同上
3.2 数组类型的append方法
这种方法的参数为一个包含原始类型变量或Object变量的数组,但参数中可能含有FieldName,也可以没有。如果含有FieldName,参数中可能含有是否输出细节的布尔变量fullDetail,也可能没有。
boolean利用style的对应append方法进行输出,其中如果没提供FieldName,置null。如果提供了FieldName,而没有提 供fullDetail,则fullDetail置null。否则利用BooleanUtils的toBooleanObject把boolean变量转 换为Boolean.TRUE或Boolean.FALSE。
byte,char,double,float,int,long,Object,short同上
4.reflectionToString族
这组方法使用静态方式,提供对对象字段的自动映射和输出的功能,其原理采用ReflectionToStringBuilder的对应toString方法处理。
5.toString方法
toString方法输出最后的字符串。执行以下操作:
如果object为空,则利用style的getNullText方法输出空标记。
否则利用style的appendEnd输出结束标记。
返回buffer的toString方法。
6.其它
6.1 appendAsObjectToString方法
同ToStringStyle的appendCyclicObject方法。
6.2 appendSuper方法
同ToStringStyle的同名方法。
6.3 appendToString方法
同ToStringStyle的同名方法。
前因: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 源码 .
- ToStringBuilder和ToStringStyle(覆盖每个实体的 toString 方法)
- ToStringBuilder和ToStringStyle(覆盖每个实体的 toString 方法)
- ToStringBuilder和ToStringStyle(覆盖每个实体的 toString 方法)
- ToStringBuilder和ToStringStyle
- toString() ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE)
- 关于toString方法的重写工具ToStringBuilder
- 关于toString方法的重写工具ToStringBuilder
- 使用ToStringBuilder重写toString方法
- 覆盖toString()方法的坑
- Jakarta Commnos lang学习(2)——ToStringBuilder和ToStringStyle
- 覆盖Object类的equals、hashCode和toString方法
- ToStringBuilder、HashCodeBuilder、EqualsBuilder、ToStringStyle、ReflectionToStringBuilder、CompareToBuild
- 实体对象toString()方法的用处
- 实体类自动重写toString(),equals()和hashCode()方法
- java实体类toString方法
- java反射覆盖toString()方法
- Object的equals方法和toString方法
- 详解每个类中toString()方法
- CSS-Day03-CSS样式-链接,列表,轮廓属性
- hdoj 4824 Disk Schedule 【TSP】
- html作业总结
- 在Android studio 项目中使用 9patch常见问题解决
- MapReduce原理与设计思想
- ToStringBuilder和ToStringStyle(覆盖每个实体的 toString 方法)
- 【Android】Genymotion打开出现Unable to load VirtualBox engine
- 最后一片叶子--欧亨利
- 数据库 CLI 操作
- Ubuntu下安装Python3.4
- HDU1425:sort(哈希思想!)
- CLAHE代码
- 用“运行”窗口快速打开电脑中的软件
- Windows神器 Cmder