commons-lang(builder应用)

commons-lang(builder应用)
2011年08月01日
   在网上找了一下,并没有发现关于commons-lang的详细使用方法,最近也有空,所以仔细的学习了一下,发在网上,也可供大家参考。
  builder包的作用主要是为了帮助程序员创建一致的equals(Object), toString(), hashCode(), compareTo(Object) 方法。说实话这些方法如果完全由程序员自己来实现的确有些困难,有很多细节需要注意,但现实通过builder包提供的帮助,实现起来要容易得多。它包括以下几个类:
  CompareToBuilder
  EqualsBuilder
  HashCodeBuilder
  ReflectionToStringBuilder
  StandardToStringStyle
  ToStringBuilder
  ToStringStyle
  最后四个都与toString()有关,前面三个通过名字就知道它们对什么方法提供帮助。下面将一一介绍。
  首先来看CompareToBuilder的用法,要明白这个方法的用法,首先要知道compareTo是用来做什么的。compareTo(T o)是Comparable接口的一个方法,此方法的作用是比较元素。如果只从单一的方法上来看,并没有看出它有什么用。然而它与其它类结合起来使用,则会提供相当强大的功能,JDK内部的许多类都与它相关,特别是集合类与数组。只要一个类实现了Comparable接口,它的实例就存在内部的排序关系。如果一个数组内部的对象实现了Comparable接口,就可以直接对它排序:
  Arrays.sort(a);
  Java 类库的所有具有值的类都实现了Comparable接口,这很重要。如TreeSet,它是一个保持次序的Set,但内部的元素必须实现Comparable接口。
  明白了Comparable是做什么的以后,就需要明白该怎么编写实现了Comparable接口的CompareTo方法。具体编写规则比较多,详细过程可参考effective Java 第二版,上面说得比较详细,而这也正是CompareToBuilder该上场的时候了。
  CompareToBuilder主要有两种方法
  append(arg1,arg2):append方法用于添加需要比较的字段,反回CompareToBuilder对象,这很重要,这样就可以通过连缀的方式来使用方法,显得更加的优雅紧凑。
  reflectionCompare(arg1,arg2):通过反射的方式来比较字段,这个方法有个好处就是一次性解决问题,append需要一个一个的添加需要比较的字段。但是也有一个缺点,那就是反射会牺牲一部分性能,虽然新版本的JDK对反射进行过优化。用法如下:
  public int compareTo(Object o) { return CompareToBuilder.reflectionCompare(this, o); }
  下面通过一个例子来说明:
  class Number implements Comparable { private int n1; private int n2; private String[] array; public Number(){ } public Number(int n1, int n2,String[] array) { this.n1 = n1; this.n2 = n2; this.array = array; } public int getN1() { return n1; } public void setN1(int n1) { this.n1 = n1; } public int getN2() { return n2; } public void setN2(int n2) { this.n2 = n2; } public String[] getArray() { return array; } public void setArray(String[] array) { this.array = array; } public int compareTo(Number number) { return new CompareToBuilder() .append(this.n1, number.n1).append(this.n2, number.n2) .append(this.array, number.array) .toComparison(); } public String toString(){ return "n1="+n1+" n2="+n2+" array="+Arrays.toString(array)+"======"; }
  上面这个类实现Comparable接口,也实现了它的compareTo方法。它在compareTo方法中就用到了CompareToBuilder类,toComparison表示返回比较的结果,负数表示小于,0表示等于,正数表示大于。上面短短几行代码就完成了compareTo的编写,如果程序员手动去实现会复杂得多。
  通过下面的代码来测试一下:
  @Test public void appendTest() { String[] s1 = {"asd","fsd"}; String[] s2 = {"asd","fsd"}; String[] s3 = {"asd","asd"}; Number[] n = {new Number(2,4,s1), new Number(4,6,s2),new Number(2,3,s3) ,new Number(4,5,s2),new Number(4,5,s3) }; System.out.println(Arrays.toString(n)); Arrays.sort(n); System.out.println(Arrays.toString(n)); }
  默认的排序方式是由低到高,由大到小,可通过输出结果对比,的确实现了排序。但上面的toString()的实现则并不优雅。众所周知,大多数时候我们都应该实现自己的toString(),让所有的对象都有统一格式的toString(),这样阅读与解析就更加的容易。编写toString()方法并没有什么特别的限制,但基本要求是应该返回所有值得关注的信息。上面的方法中,如果用ToStringBuilder来完成,会相对优雅一些:
  public String toString(){ return new ToStringBuilder(this,ToStringStyle.SHORT_PREFIX_ST YLE). append("n1", n1). append("n2", n2). append("array", array). toString(); }
  输出为:
  [Number[n1=2,n2=4,array={asd,fsd}]................ ..
  其中ToStringStyle指定输出显示的格式,个人感觉ToStringStyle预定义的字段已经够用了,如果对所有预定义的格式都不满意,也可以手动设置自己的风格。由于ToStringStyle只是一个抽象的类,所以可以继承此类实现自己的风格。当然builder包也提供了一种实现了此接口的标准风格类StandardToStringStyle。其实StandardToStringStyle本身什么也没做,用的仍然是ToStringStyle提供的方法,只是把一些ToStringStyle通过protected保护起来的方法用public把它公开了而已。StandardToStringStyle的用法其实也很简单:
  System.out.println(standard.getArrayEnd()); standard.setArrayEnd("]"); System.out.println(standard.getArrayEnd());
  通过get查看系统预定义属性,通过set修改预定定义属性。
  ToStringBuilder还提供类似其它类的reflectionToString,作用也大同小异,用法如下:
  public String toString() { return ToStringBuilder.reflectionToString(this); }
  至于ReflectionToStringBuilder,其实就是为ToStringBuilder的reflectionToString提供具体的实现,在ToStringBuilder有如下这样的代码:
  public static String reflectionToString(Object object) { return ReflectionToStringBuilder.toString(object); }
  剩下的EqualBuilder与HashCodeBuilder用法与ComparableToBuilder的用法完全相似。
  总结:虽然在新版本的JDK中,已经有实现或替代commons-lang组件的一些类库,但还是有一些JDK无法替代的类库,个人认为这是整个commons-lang包最有用的几个子包之一,能用到的场合也相当的广泛,可以说大多数时候都会用到,因此每个人都应该好好掌握这些基础的类库。
  
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值