Java的Comparable接口的一个陷阱

发表于:2012-5-09 09:28

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:王振威    来源:51Testing软件测试网采编

  Java的Comparable接口提供一个对实现了这个接口的对象列表进行排序的办法。原始的排序对于简单的对象来说具有意义,但是当我们面对复杂的面向对象的业务逻辑对象时,事情变得复杂的多。从业务经理的角度来看,一些交易对象的自然顺序可能是按照交易的价值来排序的,但是从系统管理员的角度来看,这个排序的规则可能是交易的速度。所以在大多数情况下,并没有明确的业务领域对象的自然排序规则。

  假设我们找到了一个需要排序的类,比如说Campany。我们把公司的offical name作为主关键字,把id作为次要关键字。这个类的实现如下:

  1. public class Company implements Comparable<Company> {  
  2.    
  3.     private final String id;  
  4.     private final String officialName;  
  5.    
  6.     public Company(final String id, final String officialName) {  
  7.         this.id = id;  
  8.         this.officialName = officialName;  
  9.     }  
  10.    
  11.     public String getId() {  
  12.         return id;  
  13.     }  
  14.    
  15.     public String getOfficialName() {  
  16.         return officialName;  
  17.     }  
  18.    
  19.     @Override 
  20.     public int hashCode() {  
  21.         HashCodeBuilder builder = new HashCodeBuilder(1729);  
  22.         builder.append(this.getId());  
  23.         builder.append(this.getOfficialName());  
  24.         return builder.toHashCode();  
  25.     }  
  26.    
  27.     @Override 
  28.     public boolean equals(final Object obj) {  
  29.         if (obj == this) {  
  30.             return true;  
  31.         }  
  32.         if (!(obj instanceof Company)) {  
  33.             return false;  
  34.         }  
  35.         Company other = (Company) obj;  
  36.         EqualsBuilder builder = new EqualsBuilder();  
  37.         builder.append(this.getId(), other.getId());  
  38.         builder.append(this.getOfficialName(), other.getOfficialName());  
  39.         return builder.isEquals();  
  40.     }  
  41.    
  42.     @Override 
  43.     public int compareTo(final Company obj) {  
  44.         CompareToBuilder builder = new CompareToBuilder();  
  45.         builder.append(this.getOfficialName(), obj.getOfficialName());  
  46.         builder.append(this.getId(), obj.getId());  
  47.         return builder.toComparison();  
  48.     }  
  49. }

  这个实现看起来没问题,假设现在这个类提供的信息不够使用,我们又创建了这个类的一个子类CompanyDetail类用以扩展他。例如我们想以一个表的形式显示公司的信息,我们就可以用这个类。

  1. public class CompanyDetails extends Company {  
  2.    
  3.     private final String marketingName;  
  4.     private final Double marketValue;  
  5.    
  6.     public CompanyDetails(final String id, final String officialName, final String marketingName, final Double marketValue) {  
  7.         super(id, officialName);  
  8.         this.marketingName = marketingName;  
  9.         this.marketValue = marketValue;  
  10.     }  
  11.    
  12.     public String getMarketingName() {  
  13.         return marketingName;  
  14.     }  
  15.    
  16.     public Double getMarketValue() {  
  17.         return marketValue;  
  18.     }  
  19.    
  20.     @Override 
  21.     public int hashCode() {  
  22.         HashCodeBuilder builder = new HashCodeBuilder(1931);  
  23.         builder.appendSuper(super.hashCode());  
  24.         builder.append(this.getMarketingName());  
  25.         return builder.toHashCode();  
  26.     }  
  27.    
  28.     @Override 
  29.     public boolean equals(final Object obj) {  
  30.         if (obj == this) {  
  31.             return true;  
  32.         }  
  33.         if (!(obj instanceof CompanyDetails)) {  
  34.             return false;  
  35.         }  
  36.         CompanyDetails other = (CompanyDetails) obj;  
  37.         EqualsBuilder builder = new EqualsBuilder();  
  38.         builder.appendSuper(super.equals(obj));  
  39.         builder.append(this.getMarketingName(), other.getMarketingName());  
  40.         builder.append(this.getMarketValue(), other.getMarketValue());  
  41.         return builder.isEquals();  
  42.     }  
  43. }

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号