ToStringBuilder学习(一):常用方法介绍

一、简介与引入
  
1、ToStringBuilder、HashCodeBuilder、EqualsBuilder、ToStringStyle、ReflectionToStringBuilder、CompareToBuilder等这些类都是位于commons-lang.jar下面的,所以要使用这些类一定要导入commons-lang.jar

2、为什么要使用ToStringBuilder?

系统中一般都要打印日志的,因为所有实体的toString()方法 都用的是简单的"+",因为每"+" 一个就会 new 一个
String
对象,这样如果系统内存小的话会暴内存(前提系统实体比较多)。使用ToStringBuilder就可以避免暴内存这种问题的。

二、示例学习
 
1、
ToStringBuilder的append方法

ToStringBuilder类主要用于类的格式化输出。ToStringBuilder中append方法可以向该类添加基本类型、数组、和对象,只有添加的方法才会被toString输出。如:

class TaxReturn {
  private String ssn;
  private int year;
  private String lastName;
  private BigDecimal taxableIncome;
  // get/set方法省略
  public TaxReturn() {
  }
 public TaxReturn(String pSsn, int pYear, String
pLastName, BigDecimal pTaxableIncome) { 
   
setSsn(pSsn); 
   
setYear(pYear); 
   
setLastName(pLastName); 
   
setTaxableIncome(pTaxableIncome); 
  } 
  public String toString()
{
    return
new
ToStringBuilder(this).append("ssn", ssn).append("year",
year).append("lastName",
       
lastName).toString();

  }

  public int hashCode() {
    return
new HashCodeBuilder(3,
7).append(ssn).append(year).toHashCode();

  }

public boolean
equals(Object pObject) {
    boolean
equals = false;
    if (pObject
instanceof TaxReturn) {
     
TaxReturn bean = (TaxReturn) pObject;
     
equals = (new EqualsBuilder().append(ssn, bean.ssn).append(year,
bean.year)).isEquals();

    }
    return
equals;
  }

public int
compareTo(Object pObject) {
    return
CompareToBuilder.reflectionCompare(this, pObject);
  }

}

public class MainClass {

public static void main(String[] pArgs) throws
Exception {
    
TaxReturn return1 = new TaxReturn("012-68-3242", 1998, "O‘Brien",
new BigDecimal(43000.00));
    
TaxReturn return2 = new TaxReturn("012-68-3242", 1999, "O‘Brien",
new BigDecimal(45000.00));
    
TaxReturn return3 = new TaxReturn("012-68-3242", 1999, "O‘Brien",
new BigDecimal(53222.00));
    
System.out.println("ToStringBuilder: " + return1.toString());
  }
}
运行结果如下:
   ToStringBuilder:
[email protected][ssn=012-68-3242,year=1998,lastName=O‘Brien]

2、ToStringBuilder的reflectionToString方法


    
该方法主要是把类对应的基本属性和值输出来。如:
public class MainClass {
    public
static void main(String[] args) {
       
MyClass one = new MyClass("Becker", 35);
       
MyClass two = new MyClass("Becker", 35);
       
MyClass three = new MyClass("Agassi", 33);

System.out.println("One>>>"
+ one);
       
System.out.println("Two>>>"
+ two);
       
System.out.println("Three>>>"
+ three);

System.out.println("one equals two? " + one.equals(two));
       
System.out.println("one equals three? " + one.equals(three));

System.out.println("One
HashCode>>> " +
one.hashCode());
       
System.out.println("Two
HashCode>>> " +
two.hashCode());
       
System.out.println("Three
HashCode>>> " +
three.hashCode());
    }
}

class MyClass {
    private
String name = null;
    private int
age = 0;

public
MyClass(String name, int age) {
       
this.name = name;
       
this.age = age;
    }

public boolean equals(Object obj) {
       
return EqualsBuilder.reflectionEquals(this, obj);
   
}

public String
toString() {
       
return ToStringBuilder.reflectionToString(this,
           
ToStringStyle.MULTI_LINE_STYLE);

   
}

public int hashCode() {
       
return HashCodeBuilder.reflectionHashCode(this);
   
}
}
运行结果如下:

One>>>[email protected][

name=Becker
  age=35
]
Two>>>[email protected][

name=Becker
  age=35
]
Three>>>[email protected][

name=Agassi
  age=33
]
one equals two? true
one equals three? false
One HashCode>>>
462213092
Two HashCode>>>
462213092
Three HashCode>>>
-530629296

ToStringStyle参数说明:
1. DEFAULT_STYLE
  
[email protected][name=John Doe,age=33,smoker=false]
2. MULTI_LINE_STYLE
   
[email protected][
   name=John Doe
   age=33
   smoker=false
]
3. NO_FIELD_NAMES_STYLE
   [email protected][John
Doe,33,false]
4. SHORT_PREFIX_STYLE  
(即截去了包名)

  Person[name=John Doe,age=33,smoker=false]
5. SIMPLE_STYLE
   John Doe,33,false

###############################################

附加:
    无论你在开发哪中
Java
应用程序,都免不了要写很多工具类/工具函数。你可知道,有很多现成的工具类可用,并且代码质量都很不错,不用你写,不用你调试,只要你发现。

  在 Apache Jakarta Common 中, Lang 这个 Java 工具包是所有 Apache Jakarta
Common 项目中被使用最广泛的,几乎你所知道的名气比较大的软件里面都有用到它,包括 Tomcat, Weblogic,
Websphere, Eclipse 等等。我们就从这个包开始介绍整个 common 项目。

Lang 中工具类比较多,这里介绍几个主要的:
  ClassUtils: 
getShortClassName,这个函数应该在 java.lang.Class
类中有的,我看到很多人自己写这个函数。getAllInterfaces,convertClassNamesToClasses,isAssignable,primitivesToWrappers,isInnerClass。

  NumberUtils: 关于数字以及数字和字符串转换的类
stringToInt,toDouble,createNumber,isAllZeros, int compare(float
lhs, float rhs), isNumber(String str),double min(double[]
array)。
  RandomUtils: 用于产生随机数的。
  DateFormatUtils
日期时间格式转换,以及本地时间和 UTC 时间转换。
  DateUtils:
日期工具类。isSameDay,truncate,round,modify。

  基于反射机制的几个类:
  CompareToBuilder:
比较,用在算法、排序、比较的地方。reflectionCompare,append。
  EqualsBuilder:
通过反射机制比较。reflectionEquals 很多项目中用到。
  HashCodeBuilder: 可以通过反射生成
hash code,很多算法的地方涉及到 hash code,但是并不是每个人都知道一种 hash code 的生成方法。
  ToStringBuilder: 当你需要重载
toString 函数而不想写代码把当前类的所有成员信息列出来,可以用这个函数。

  其它的几个类我用得比较少:
  SerializationUtils 
Java中得序列化比较奥妙,容易出错啊。
  SystemUtils 可以读取一些关于 jdk
信息,操作系统信息的工具类。

时间: 2024-11-19 09:19:38

ToStringBuilder学习(一):常用方法介绍的相关文章

ToStringBuilder 学习

一.简介与引入   1.ToStringBuilder.HashCodeBuilder.EqualsBuilder.ToStringStyle.ReflectionToStringBuilder.CompareToBuilder等这些类都是位于commons-lang.jar下面的,所以要使用这些类一定要导入commons-lang.jar.   2.为什么要使用ToStringBuilder?     系统中一般都要打印日志的,因为所有实体的toString()方法 都用的是简单的"+&quo

学习日记-----存储过程介绍

SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. ? 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储

iOS学习之NSBundle介绍和使用

iOS学习之NSBundle介绍和使用 http://blog.csdn.net/totogo2010/article/details/7672271 新建一个Single View Application,并在加入viewDidLoad方法里加入如下代码: [cpp] view plaincopy //    通过使用下面的方法得到程序的main bundle NSBundle *mainBundle = [NSBundle mainBundle]; NSString *imagePath =

ToStringBuilder学习(三):readResolve()方法与序列化

在ToStringBuilder学习(一)中提到一个问题,即 readResolve方法是干啥的? 当时也没多想, 只是列在那里, 今天忙里偷闲地把搜点材料整理下这个问题. 原来这个方法跟对象的序列化相关(这样倒是解释了为什么 readResolve方法是private修饰的). ??? 怎么跟对象的序列化相关了? 下面我们先简要地回顾下对象的序列化. 一般来说, 一个类实现了 Serializable接口, 我们就可以把它往内存地写再从内存里读出而"组装"成一个跟原来一模一样的对象.

转:Oracle GoldenGate学习之Goldengate介绍

转自:http://blog.sina.com.cn/s/blog_a32eff28010136d9.html 日志或归档日志获得数据的增删改变化,再将这些变化应用到目标数据库,实现源数据库与目标数据库同步.双活.GoldenGate TDM 软件可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒一级的实时复制,其复制过程简图如下: 如上图所示,GoldenGate TDM的数据复制过程如下: 利用捕捉进程(Capture Process)在源系统端读取On

python学习手册——1介绍python对象类型

在python ,数据以对象的形式出现--无论是python提供的内置对象,还是使用python或是像C扩展库这样的扩展语言工具创建的对象.尽管在以后才能确定这一概念,但对象无非是内在中的一部分,包含数值和相关操作的集合. 由于对象是python 最基本的概念,从这一章开始我们将会全面地体验python的内置对象类型. python程序可以分解成模块,语句,表达式以及对象,如下所示: 1.程序由模块构成 2.模块包含语句 3.语句包含表达式 4.表达式建立并处理对象 为什么使用内置类型 1.内置

CI框架学习(1)-框架介绍控制器建立与访问

前言:入行算3年了,专职开始敲代码也有1年半的时间.技术底子一直很差,现在依然在菜鸟级别,上班都是无用功的忙碌很少思考终结,导致代码敲了就忘没有积累.工作期间大致使用过3个框架ecshop.ThinkPhP.CI,都是皮毛不深入,代码管理的也都很混乱.基于现在手上的项目是用CI框架,就决定系统学习下此框架,打下基础方便于以后对项目的管理. 学习形势:看视频 + 笔记(仅记录重点或不知道的知识)    视频地址(CI框架学习(1)-框架介绍控制器建立与访问) [重点1]CI框架的目录结构 appl

Oracle GoldenGate学习之Goldengate介绍

Oracle GoldenGate学习之Goldengate介绍 (2012-10-02 17:07:27) 标签: 检查点 数据传输 队列 进程 分类: Goldengate Goldengate介绍 GoldenGate TDM(交易数据管理)软件是一种基于日志的结构化数据复制软件,它通过解析源数据库在线日志或归档日志获得数据的增删改变化,再将这些变化应用到目标数据库,实现源数据库与目标数据库同步.双活.GoldenGate TDM 软件可以在异构的IT基础结构(包括几乎所有常用操作系统平台

JavaScript入门学习之四——DOM介绍及常用方法

在前面我们学习了JavaScript的基本语法,紧靠这些代码我们还无法实现浏览器的交互.也就是说我们还不能做出来平时常见到的网页交互.下面就需要引入一个新的知识点,也就是这一章要讲的:DOM. BOM——Browser Object Module,是指浏览器对象模型.通过这个模型可以实现JavaScript和浏览器之间的对话,包括后面要学习的DOM,可以访问Html中的所有文档中的元素. window对象 所有的浏览器都支持window对象,他表示浏览器窗口.所有的JavaScript全局对象,