`

[Jakarta Commons笔记] commons.lang.builder

阅读更多

在前面的专题文章中,我们一起过了一遍org.apache.commons.lang包,接下来我们继续看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日志)。然而实现这些compareToequalshashCodetoString其实并非那么直截了当,甚至稍有不注意就可能造成难以追踪的bug,而且这些方法手工维护的话,比较繁琐,也容易出错。于是Commons Langbuilder这个包中提供了上述辅助类,为我们简化这些方法的实现和维护。

 

来看一个例子:

 

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需要参与的信息,最后加上toComparisonisEqualstoHashCodetoString这样的结尾即可。相应的,如果你不需要这样级别的控制,也可以使用利用反射机制的版本自动化实现需要的功能,如:

 

    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就成了方便而相对安全的一个方案。

分享到:
评论

相关推荐

    apache-jakarta旗下的所有开源项目jar文件

    apache-jakarta-commons-lang.jar apache-jakarta-commons-logging-adapters.jar apache-jakarta-commons-logging-api.jar apache-jakarta-commons-net.jar apache-jakarta-commons-net-1.4.1.jar apache-jakarta-...

    tomcat10升级单个jar里面的jakarta.servlet.http.HttpServletRequest

    入参的HttpServletRequest必须为:import jakarta.servlet.http.HttpServletRequest; 运行cmd,再该目录下执行: 执行步骤:java -jar jakartaee-migration-1.0.1.jar commons-fileupload-1.4.jar commons-...

    jakarta.servlet.jsp.jstl-api-2.0.0.jar

    标题中的"jakarta.servlet.jsp.jstl-api-2.0.0.jar"是一个重要的Java Web开发组件,它属于JavaServer Pages(JSP)标准标签库(JSTL)的一部分,用于提供一套标准的标签来简化HTML或XML文档的生成。JSTL的主要目标是...

    Jakarta commons\Apache Jakarta Commons Reusable Java Components.chm

    本书是一本介绍apache commons使用的电子书

    jakarta-commons 相关依赖包

    jakarta-commons 相关依赖包,文件列表: commons-attributes-api.jar commons-attributes-compiler.jar commons-beanutils.jar commons-codec.jar commons-collections.jar commons-dbcp.jar commons-digester.jar ...

    commons-net-1.4.1 和 jakarta-oro-2.0.8 .rar

    标题中的"commons-net-1.4.1"和"jakarta-oro-2.0.8"指的是两个开源Java库,分别由Apache Commons项目和Jakarta项目开发。这两个库在Java编程中扮演着重要的角色,提供了不同的功能和服务。 Apache Commons Net是...

    Jakarta Commons笔记

    - **org.apache.commons.lang.builder**:提供了一系列用于构建`toString()`、`hashCode()`、`equals()`等方法的工具类。 - **org.apache.commons.lang.enum**:该包已不再推荐使用,建议使用`org.apache.commons....

    jakarta-oro-2.0.8.jar

    使用commons的net包进行ftp链接,commons-net包封装了一些常见的网络包:ftp,smtp,pop3等 相关包:commons-net-1.4.1.jar ; commons-io-1.4.jar;jakarta-oro-2.0.8.jar

    apache的FTP包commons-net-1.4.1.jar,jakarta-oro-2.0.8.jar

    Apache的FTP库是Java开发中一个非常实用的工具,它主要包含了两个核心的JAR包:`commons-net-1.4.1.jar`和`jakarta-oro-2.0.8.jar`。这两个包提供了丰富的功能,允许开发者在Java应用中实现FTP(文件传输协议)的...

    ftp所需jar包(commons-net-1.4.1.jar,jakarta-oro-2.0.8.jar)

    在这个场景中,我们关注的是两个特定的Java库文件:`commons-net-1.4.1.jar` 和 `jakarta-oro-2.0.8.jar`,它们是实现FTP功能的关键组件。 `commons-net-1.4.1.jar` 是Apache Commons Net库的一个版本,这是一个...

    jakarta commons-API

    **Jakarta Commons API** 是一个Java开发人员广泛使用的开源库集合,它包含了多个模块,每个模块专注于特定的编程任务,从而简化了Java应用程序的开发。Jakarta Commons是Apache软件基金会的一个项目,它提供了大量...

    Jakarta Commons组件之Lang

    本文将深入探讨Jakarta Commons Lang组件以及在`commons-lang-2.3-src.zip`压缩包中的相关资源。 首先,`commons-lang-2.3-src.zip`是Jakarta Commons Lang 2.3版本的源代码压缩包,对于开发者来说,源码是理解库...

    Jakarta Commons cookbook.chm与中文版的笔记

    《Jakarta Commons Cookbook》是Java开发者的一本重要参考资料,它主要涵盖了Apache Jakarta Commons项目中的各种组件和工具的使用方法。Apache Commons是Java开发中的一个关键部分,提供了许多实用且功能强大的类库...

    commons-net-3.3.jar、jakarta-oro-2.0.8.jar、javacsv.jar

    本篇将详细介绍标题中提及的三个jar包——"commons-net-3.3.jar"、"jakarta-oro-2.0.8.jar"和"javacsv.jar",以及它们在FTP连接中的作用。 1. **Apache Commons Net 3.3.jar** Apache Commons Net是Apache软件基金...

    jakarta.activation-1.2.2-API文档-中英对照版.zip

    赠送jar包:jakarta.activation-1.2.2.jar; 赠送原API文档:jakarta.activation-1.2.2-javadoc.jar; 赠送源代码:jakarta.activation-1.2.2-sources.jar; 赠送Maven依赖信息文件:jakarta.activation-1.2.2.pom;...

    [Jakarta Commons笔记]

    【Jakarta Commons笔记】 Jakarta Commons是Apache软件基金会的一个项目集合,它提供了许多Java开发中常用的工具类和组件。这个项目旨在减少重复的工作,通过共享和重用代码,提高开发效率。Jakarta Commons包含了...

    jakarta.el-3.0.3-API文档-中文版.zip

    赠送jar包:jakarta.el-3.0.3.jar; 赠送原API文档:jakarta.el-3.0.3-javadoc.jar; 赠送源代码:jakarta.el-3.0.3-sources.jar; 赠送Maven依赖信息文件:jakarta.el-3.0.3.pom; 包含翻译后的API文档:jakarta.el...

    jakarta.annotation-api-1.3.5-API文档-中文版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

Global site tag (gtag.js) - Google Analytics