您的位置:首页 > 产品设计 > UI/UE

ToStringBuilder和ToStringStyle(覆盖每个实体的 toString 方法)

2016-01-14 18:59 381 查看
今天系统要打印日志,发现所有实体的toString()方法 都用的是简单的"+",因为每"+" 一个就会 new 一个 String 对象,

这样如果系统内存小的话会暴内存(前提系统实体比较多)。



由于打印的时候包含包名,感觉太长了,

使用ToStringStyle.SHORT_PREFIX_STYLE 截掉包名


import java.lang.reflect.Field;

import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;




@Override
public String toString() {
//以前的“+”写法
/*return "HolidayConfig [end_date=" + end_date + ", holiday_date="
+ holiday_date + ", holiday_id=" + holiday_id
+ ", holiday_name=" + holiday_name + ", holiday_type="
+ holiday_type + ", state=" + state + "]";*/

//现在平常实体调用的方法
return ToStringBuilder.reflectionToString(this,ToStringStyle.SHORT_PREFIX_STYLE);


//user实体不打印password机密信息使用方法
return (new ReflectionToStringBuilder(this) {
protected boolean accept(Field f) {
return super.accept(f) && !f.getName().equals("password");
}
}).toString();
}


打印样列:
com.domain.entity.parameterconfig.HolidayConfig@60aeb0[holiday_id=11,holiday_name=6666,end_date=<null>,holiday_type=1,state=<null>]

截掉包名后只剩下类名:
TariffTimeSpan[tariffTimeSpanPK=TariffTimeSpanPK[time_span_id=123456,favor_type=1,time_begin=<null>],time_span_name=<null>,time_end=<null>,discount=115,eff_time=Thu Jan 06 17:31:10 CST 2011,exp_time=Sun Jan 06 17:31:10 CST 4109,staff_id=<null>,create_time=<null>]



参考资料:
http://rmn190.javaeye.com/blog/349479
---------------------------------------------------------------------------------

ToStringBuilder用于生成对象的toString方法,在MiddleGen中比较常见。它的核心是使用ToStringStyle生成字符串。所以对其分析是建立在对ToStringStyle的分析之上的。

1.私有变量

ToStringStyle defaultStyle;缺省的Style,缺省赋值为ToStringStyle.DEFAULT_STYLE。

StringBuffer buffer;用于连接所有内容的SB。

Object object;需要输出的对象。

ToStringStyle style;所使用的Style。

2.构造函数

ToStringBuilder的构造函数必须最少包含需要输出的对象,另外也可以在构函中指定buffer和style。下面只描述全参数的处理过程:


如果style为空,则使用缺省的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的同名方法。

原文地址:http://blog.csdn.net/cuker919/article/details/6120920

前因: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 源码 .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: