天天看點

Apache Commons Lang之hashCode()、equals()和compareTo()

Apache Commons Lang提供一套生成hashCode()、equals()和compareTo()的API,簡單易用。這個與toString()工具用法類似。

一、實作政策

1、hashCode()

通過HashCodeBuilder反射來生成,這說明類的hashCode與類中所有的域都相關。

也可以通過HashCodeBuilder執行個體來制定生成。

2、equals()

也有兩種生成方式,與toString()、hashCode()的生成政策類似。

3、compareTo()

與以上都類似。

二、執行個體

為了測試,創佳兩個類 Foo、Bar,參看上篇文章,分别通過兩種方式實作其hashCode()和equals()方法

public class Foo { 

        private String name; 

        private int age; 

        private Bar bar; 

        public Foo(String name, int age) { 

                this.name = name; 

                this.age = age; 

        }

        //省略getter/setter方法 

}

public class Bar { 

        public Bar(String name) { 

1、實作hashCode()

反射方式

        @Override 

        public int hashCode() { 

                return HashCodeBuilder.reflectionHashCode(this); 

制定方式

                return new HashCodeBuilder(17, 37) 

                                .append(name) 

                                .append(age) 

                                .append(bar) 

                                .toHashCode(); 

2、實作equals()

        public boolean equals(Object obj) { 

                return EqualsBuilder.reflectionEquals(this, obj); 

                boolean flag = false; 

                if (obj != null && Foo.class.isAssignableFrom(obj.getClass())) { 

                        Foo f = (Foo) obj; 

                        flag = new EqualsBuilder() 

                                        .append(name, f.getName()) 

                                        .append(age, f.getAge()) 

                                        .append(bar, f.getBar()).isEquals(); 

                } 

                return flag; 

3、生成compareTo()

當然,實作compareTo()的前提是Foo類實作了Comparable接口。否則沒啥意義。

反射實作

        public int compareTo(Object obj) { 

                return CompareToBuilder.reflectionCompare(this, obj); 

制定實作

                int flag = -1; 

                        flag = new CompareToBuilder() 

                                        .append(name, getName()) 

                                        .append(bar, f.getBar()) 

                                        .toComparison(); 

很好,很強大!

EqualsBuilder不光可以比較對象,還可以通過其對象來比較各種類型的資料。包括數組。

本文轉自 leizhimin 51CTO部落格,原文連結:http://blog.51cto.com/lavasoft/113800,如需轉載請自行聯系原作者