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();
- }
- }
|
这个实现看起来没问题,假设现在这个类提供的信息不够使用,我们又创建了这个类的一个子类CompanyDetail类用以扩展他。例如我们想以一个表的形式显示公司的信息,我们就可以用这个类。
- public class CompanyDetails extends Company {
-
- private final String marketingName;
- private final Double marketValue;
-
- public CompanyDetails(final String id, final String officialName, final String marketingName, final Double marketValue) {
- super(id, officialName);
- this.marketingName = marketingName;
- this.marketValue = marketValue;
- }
-
- public String getMarketingName() {
- return marketingName;
- }
-
- public Double getMarketValue() {
- return marketValue;
- }
-
- @Override
- public int hashCode() {
- HashCodeBuilder builder = new HashCodeBuilder(19, 31);
- builder.appendSuper(super.hashCode());
- builder.append(this.getMarketingName());
- return builder.toHashCode();
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (obj == this) {
- return true;
- }
- if (!(obj instanceof CompanyDetails)) {
- return false;
- }
- CompanyDetails other = (CompanyDetails) obj;
- EqualsBuilder builder = new EqualsBuilder();
- builder.appendSuper(super.equals(obj));
- builder.append(this.getMarketingName(), other.getMarketingName());
- builder.append(this.getMarketValue(), other.getMarketValue());
- return builder.isEquals();
- }
- }
|