`

commons-lang(builder应用)

JDK 
阅读更多
在网上找了一下,并没有发现关于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<Number> {
	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_STYLE).
	       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包最有用的几个子包之一,能用到的场合也相当的广泛,可以说大多数时候都会用到,因此每个人都应该好好掌握这些基础的类库。
分享到:
评论

相关推荐

    commons-lang.jar

    org.apache.commons.lang.builder.ToStringStyle$NoFieldNameToStringStyle.class org.apache.commons.lang.builder.ToStringStyle$ShortPrefixToStringStyle.class org.apache.commons.lang.builder.ToStringStyle$...

    commons-lang3-3.1.jar_2021.07.zip

    《Apache Commons Lang 3.1:Java编程的强大工具》 Apache Commons Lang 是一个Apache软件基金会提供的Java类库,专门用于处理日常编程任务。这个库包含了大量实用的工具类,极大地扩展了Java的标准库,其中的版本...

    commons-lang3-3.12.0.zip

    java包。 import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder;

    org.apache.commons.lang jar包下载(commons-lang3-3.1.jar)

    org.apache.commons.lang.builder.ToStringStyle$ShortPrefixToStringStyle.class org.apache.commons.lang.builder.ToStringStyle$SimpleToStringStyle.class org.apache.commons.lang.builder.ToStringStyle....

    commons-lang3-3.3.2

    标题中的"commons-lang3-3.3.2"指的是Apache Commons Lang库的版本3.3.2。这个库是Java编程语言中一个非常重要的工具集,它提供了许多实用的类和方法,以增强Java标准库的功能。Apache Commons Lang是Apache软件基金...

    commons-lang3-3.1_jar

    Apache Commons Lang 是一个Java工具包,专门设计来扩展Java的标准库。这个`commons-lang3-3.1_jar`是Apache Commons Lang项目的一个版本,它提供了大量的类和实用方法,以增强Java语言的功能。在Java开发中,这个库...

    commons-lang3-3.0.1.jar

    《Apache Commons Lang 3.0.1:Java编程的强大工具》 Apache Commons Lang是Java开发中的一个关键组件,尤其在3.0.1版本中,它提供了大量的实用工具类,大大简化了日常的编程任务。这个名为"commons-lang3-3.0.1....

    commons-lang3-3.12.0-bin.zip

    10. **Builder模式支持**:Lang库引入了Builder模式,使得创建复杂对象变得简单。例如,`StringBuilder`和`CharSequenceBuilder`允许动态构建字符串。 11. **枚举映射**:`EnumMap`是一种高效且类型安全的映射,专...

    org.apache.commons.lang包

    Apache Commons Lang是一个非常重要的Java库,它为Java标准类库提供了许多实用的工具类和扩展。这个资源包包含了丰富的功能,极大地增强了Java开发者的生产力。标题中的"org.apache.commons.lang包"指的是该库的主要...

    org.apache.commons.lang jar包下载

    org.apache.commons.lang.builder.ToStringStyle$ShortPrefixToStringStyle.class org.apache.commons.lang.builder.ToStringStyle$SimpleToStringStyle.class org.apache.commons.lang.builder.ToStringStyle....

    commons-lang3-3.1 API

    org.apache.commons.lang.builder org.apache.commons.lang.enum org.apache.commons.lang.enums org.apache.commons.lang.exception org.apache.commons.lang.math org.apache.commons.lang.mutable org....

    apache commons-lang简介

    2.1.1.3 org.apache.commons.lang.builder 这个包主要是为了提供对象构建和比较的工具,如ToStringBuilder、HashCodeBuilder和EqualsBuilder,它们帮助开发者生成对象的toString、hashCode和equals方法,避免了重复...

    commons-lang3-3.7

    Apache Commons Lang 3.7 包含多个子包,如 `org.apache.commons.lang3`, `org.apache.commons.lang3.builder`, `org.apache.commons.lang3.text` 等,每个子包都专注于特定的功能领域。例如,`builder` 包提供了...

    java jar包

    fileupload-1.2.1 commons-httpclient-3.1 commons-io-1.4-javadoc commons-io-1.4-sources commons-io-1.4 commons-lang-2.4-javadoc commons-lang-2.4-sources commons-lang-2.4 commons-logging-1.0.4 commons-...

    org.apache.commons.lang jar下载

    11. **构建者模式**: Commons Lang 提供了多种Builder类,如 `StringBuilder` 和 `StringBuffer` 的变体,允许更灵活地构建复杂字符串。 12. **枚举枚举**: `EnumSet` 和 `EnumMap` 类提供了针对枚举类型的集合实现...

    jar包(java开发所需)

    commons-lang-2.4-javadoc.jar commons-lang-2.4-sources.jar commons-logging-1.0.4.jar commons-logging-1.1.1.jar commons-logging-1.1.jar commons-net-1.4.1.jar cpdetector_1.0.7.jar http-2.2.1.jar ...

    org.apache.commons.lang

    import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder;

    common-lang3.jar

    6. **对象工具**:`org.apache.commons.lang3.builder`提供了对象比较、深拷贝等实用工具,如`EqualsBuilder`和`HashCodeBuilder`用于实现自定义的equals()和hashCode()方法。 7. **异常处理**:`org.apache....

    org.apache.commons.lang jar包

    org.apache.commons.lang jar包

    org.apache.commons.lang3.StringUtils.jar.rar

    Apache Commons Lang 是一个由 Apache 软件基金会开发的 Java 类库,它提供了一系列实用工具类,用于增强 JDK 内置的 String 类的功能。在给定的标题 "org.apache.commons.lang3.StringUtils.jar.rar" 中,我们可以...

Global site tag (gtag.js) - Google Analytics