歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java的Comparable接口的一個陷阱

Java的Comparable接口提供一個對實現了這個接口的對象列表進行排序的辦法。原始的排序對於簡單的對象來說具有意義,但是當我們面對復雜的面向對象的業務邏輯對象時,事情變得復雜的多。從業務經理的角度來看,一些交易對象的自然順序可能是按照交易的價值來排序的,但是從系統管理員的角度來看,這個排序的規則可能是交易的速度。所以在大多數情況下,並沒有明確的業務領域對象的自然排序規則。

假設我們找到了一個需要排序的類,比如說Campany。我們把公司的offical name作為主關鍵字,把id作為次要關鍵字。這個類的實現如下:

public class Company implements Comparable<Company> {
 
    private final String id;
    private final String officialName;
 
    public Company(final String id, final String officialName) {
        this.id = id;
        this.officialName = officialName;
    }
 
    public String getId() {
        return id;
    }
 
    public String getOfficialName() {
        return officialName;
    }
 
    @Override
    public int hashCode() {
        HashCodeBuilder builder = new HashCodeBuilder(17, 29);
        builder.append(this.getId());
        builder.append(this.getOfficialName());
        return builder.toHashCode();
    }
 
    @Override
    public boolean equals(final Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof Company)) {
            return false;
        }
        Company other = (Company) obj;
        EqualsBuilder builder = new EqualsBuilder();
        builder.append(this.getId(), other.getId());
        builder.append(this.getOfficialName(), other.getOfficialName());
        return builder.isEquals();
    }
 
    @Override
    public int compareTo(final Company obj) {
        CompareToBuilder builder = new CompareToBuilder();
        builder.append(this.getOfficialName(), obj.getOfficialName());
        builder.append(this.getId(), obj.getId());
        return builder.toComparison();
    }
}

Copyright © Linux教程網 All Rights Reserved