`

org.apache.commons.lang.builder

 
阅读更多

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

分享到:
评论

相关推荐

    org.apache.commons.lang jar包下载

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

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

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

    org.apache.commons.lang

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

    org.apache.commons.lang jar包

    org.apache.commons.lang jar包

    org.apache.commons.lang包

    标题中的"org.apache.commons.lang包"指的是该库的主要命名空间,它包含了各种实用工具类,如字符串处理、日期时间操作、类型转换等。 在描述中提到,解压缩Apache Commons Lang资源包后,我们可以获取到几个关键...

    org.apache.commons.lang jar下载

    这个`org.apache.commons.lang.jar`文件是该库的一个版本,包含了Lang项目的所有包,使得开发者在处理字符串、日期、数字、反射、比较等方面的工作变得更加便捷高效。以下是关于Apache Commons Lang的一些关键知识点...

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

    在给定的标题 "org.apache.commons.lang3.StringUtils.jar.rar" 中,我们可以看到这个压缩包包含的是 `StringUtils.jar`,实际上它是一个 `common-lang3.jar` 文件的别名。这个 JAR 包是 Apache Commons Lang 项目的...

    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.class...

    commons-lang3-3.12.0.zip

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

    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方法,避免了重复...

    Jakarta Commons笔记

    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...

    Commons培训

    2. **org.apache.commons.lang.builder**:该包提供了一系列用于快速生成Java类中常见的方法(如`toString()`、`hashCode()`、`equals()`)的工具类。 3. **org.apache.commons.lang.enum**:这是一个旧的枚举处理包...

    前端-后端java的Util类的工具类

    │ │ │ frame-sourcefiles-org.apache.ibatis.builder.annotation.html │ │ │ frame-sourcefiles-org.apache.ibatis.builder.html │ │ │ frame-sourcefiles-org.apache.ibatis.builder.xml.html │ │ │ ...

    commons-lang3-3.1.jar_2021.07.zip

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

    common-lang3.jar

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

    commons-lang3-3.7

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

    Hibernate中对数据库复合主键的支持.pdf

    import org.apache.commons.lang.builder.HashCodeBuilder; // ... @Override public boolean equals(Object obj) { if (obj instanceof Person) { Person rhs = (Person) obj; return new EqualsBuilder()....

    Hibernate复合主键

    import org.apache.commons.lang.builder.HashCodeBuilder; public class TUserPK implements Serializable { private String firstname; private String lastname; public String getFirstname() { return ...

Global site tag (gtag.js) - Google Analytics