我们继续看org.apache.commons.lang.builder这个包。在这里面我们可以找到7个类,用于帮助我们实现Java对象的一些基础的共有方法。这7个类分别是:
CompareToBuilder – 用于辅助实现Comparable.compareTo(Object)方法;
EqualsBuilder – 用于辅助实现Object.equals()方法;
HashCodeBuilder – 用于辅助实现Object.hashCode()方法;
ToStringBuilder – 用于辅助实现Object.toString()方法;
ReflectionToStringBuilder – 使用反射机制辅助实现Object.toString()方法;
ToStringStyle – 辅助ToStringBuilder控制输出格式;
StandardToStringStyle – 辅助ToStringBuilder控制标准格式。
我们知道,在实际应用中,其实经常需要在运行过程中判定对象的知否相等、比较、取hash、和获取对象基本信息(一般是产生log日志)。然而实现这些compareTo、equals、hashCode、toString其实并非那么直截了当,甚至稍有不注意就可能造成难以追踪的bug,而且这些方法手工维护的话,比较繁琐,也容易出错。于是Commons Lang在builder这个包中提供了上述辅助类,为我们简化这些方法的实现和维护。
来看一个例子:
package sean.study.jakarta.commons.lang;
import java.util.Date;
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
public class BuilderUsage {
public static void main(String[] args) {
Staff staff1 = new Staff(123, "John Smith", new Date());
Staff staff2 = new Staff(456, "Jane Smith", new Date());
System.out.println("staff1's info: " + staff1);
System.out.println("staff2's info: " + staff2);
System.out.println("staff1's hash code: " + staff1.hashCode());
System.out.println("staff2's hash code: " + staff2.hashCode());
System.out.println("staff1 equals staff2? " + staff1.equals(staff2));
}
}
class Staff implements Comparable {
private long staffId;
private String staffName;
private Date dateJoined;
public Staff() {
}
public Staff(long staffId, String staffName, Date dateJoined) {
this.staffId = staffId;
this.staffName = staffName;
this.dateJoined = dateJoined;
}
public int compareTo(Object o) {
int res = -1;
if (o != null && Staff.class.isAssignableFrom(o.getClass())) {
Staff s = (Staff) o;
res = new CompareToBuilder()
.append(dateJoined, s.getDateJoined())
.append(staffName, s.getStaffName()).toComparison();
}
return res;
}
public boolean equals(Object o) {
boolean res = false;
if (o != null && Staff.class.isAssignableFrom(o.getClass())) {
Staff s = (Staff) o;
res = new EqualsBuilder()
.append(staffId, s.getStaffId())
.isEquals();
}
return res;
}
public int hashCode() {
return new HashCodeBuilder(11, 23).append(staffId).toHashCode();
}
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("staffId", staffId)
.append("staffName", staffName)
.append("dateJoined", dateJoined)
.toString();
}
public Date getDateJoined() {
return dateJoined;
}
public void setDateJoined(Date dateJoined) {
this.dateJoined = dateJoined;
}
public long getStaffId() {
return staffId;
}
public void setStaffId(long staffId) {
this.staffId = staffId;
}
public String getStaffName() {
return staffName;
}
public void setStaffName(String staffName) {
this.staffName = staffName;
}
}
以下是运行结果:
staff1's info: sean.study.jakarta.commons.lang.Staff@190d11[
staffId=123
staffName=John Smith
dateJoined=Sat Jul 30 13:18:45 CST 2005
]
staff2's info: sean.study.jakarta.commons.lang.Staff@1fb8ee3[
staffId=456
staffName=Jane Smith
dateJoined=Sat Jul 30 13:18:45 CST 2005
]
staff1's hash code: 376
staff2's hash code: 709
staff1 equals staff2? false
这些builder使用起来都很简单,new一个实例,append需要参与的信息,最后加上toComparison、isEquals、toHashCode、toString这样的结尾即可。相应的,如果你不需要这样级别的控制,也可以使用利用反射机制的版本自动化实现需要的功能,如:
public int compareTo(Object o) {
return CompareToBuilder.reflectionCompare(this, o);
}
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, o);
}
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
尤其当我们在项目中不希望过多的参与到对这些对象方法的维护时,采用Commons提供的利用反射的这些API就成了方便而相对安全的一个方案
分享到:
相关推荐
标题中的"org.apache.commons.lang包"指的是该库的主要命名空间,它包含了各种实用工具类,如字符串处理、日期时间操作、类型转换等。 在描述中提到,解压缩Apache Commons Lang资源包后,我们可以获取到几个关键...
Apache Commons Lang是Java开发中的一个非常重要的开源工具库,它提供了一系列实用的工具类,极大地丰富了Java的标准库,为开发者提供了更便捷、高效的方法来处理常见的编程任务。Lang包主要包含了对字符串操作、...
import org.apache.commons.lang.builder.HashCodeBuilder; public class EqualsHashCodeExample { private int id; private String name; public EqualsHashCodeExample(int id, String name) { this.id = id...
Apache Commons Lang是Apache软件基金会的一个开源项目,旨在帮助开发者解决日常编程任务。 描述中的"hashCodeBuilder EqualsBuilder ToStringBuilder"提到了三个关键的类,它们都是Apache Commons Lang中用于构建...
### Apache Commons Jar包常用类详解 #### 概述 Apache Commons项目是一系列为Java开发者提供的免费、可重用的开源库。这些库旨在提供解决常见编程任务的实用工具类,帮助开发者减少编码工作量,提高代码质量。...
***mons Lang还包含commons.lang.builder包,其中提供了一些用于构建对象的辅助工具类,如: - CompareToBuilder:用于实现Comparable接口时快速构建比较逻辑。 - EqualsBuilder:用于快速构建equals()方法逻辑。...
26. **commonclipse**:针对Apache Commons Lang库的Eclipse插件,自动生成常用方法。 27. **AntView**:直接在Eclipse中运行Ant构建脚本的插件。 28. **StrutsIDE**:Struts框架开发辅助工具,提供图形化的struts...
6. **org.apache.commons.lang3.builder.ToStringBuilder**:虽然Apache Commons Lang主要不是为了解析JSON,但它可以帮助你生成人类可读的字符串,包括JSON格式的表示,可以作为辅助工具。 在这些库中,`...
科学计算器可能还需要处理复数运算,这时可以使用`java.math.BigDecimal`类进行高精度计算,或者引入第三方库如`org.apache.commons.math3`。 5. **错误处理**:计算器需要能够优雅地处理无效输入,如除以零、非法...
10. **Apache相关库**:标签中的"apache"可能指的是使用了Apache相关的开源库,如HttpComponents库用于网络请求,或者Apache Commons Lang库用于字符串处理等辅助功能。 通过分析这个项目,你可以深入了解Android...
在Android开发中,Apache Commons Lang、HttpComponents等库常被用来增强功能,如字符串处理、网络请求等。源码中可能存在对这些库的依赖和调用,理解其工作原理有助于提升应用的性能和稳定性。 此外,源码中可能...
import org.apache.commons.lang3.StringUtils; public class IpAdrressUtil { /** * 获取Ip地址 * @param request * @return */ private static String getIpAdrress(HttpServletRequest request) { String...
Apache Commons Lang 3是一个实用库,提供了许多Java语言和API增强功能,可能在这个项目中用于辅助测试或对象创建。Travis CI是一个持续集成服务,它会自动运行项目的构建和测试,以确保代码质量。 **详细知识点:*...