您的位置:首页 > 编程语言 > Java开发

两个java 类如何动态比较的问题

2006-02-22 00:55 381 查看
在程序开发的过程中总是碰到需要简单动态执行比较的情况,也就是将比较方式作为参数的情况
如:

public class DynamicComparor{
 public enum OP{//六种比较方式enum
  less, lessequal, equal, greatequal, great, notequal
 }
 //执行比较, 判断a与b的比较是否符合比较方式要求
 public boolean execute(OP op, Comparable a, Object b){ 
  int k = 0;
   if(a==null&&b!=null){
    k=-1;
   }else{
    k = a.compareTo(b);
   }
  switch(op){//在这里得对每一个比较方式都得执行一遍判断
  case less:
 if(k < 0)return true;
 return false;
  case lessequal:
 if(k < 0)return true;
 if(k == 0)return true;
 return false;
  case equal:
 if(k == 0)return true;
 return false;
  case great:
   ......
  }
  return false;
 }
 
}

以上的程序需要对每一种比较方式都单独处理,但是每一种比较都是相似的,
这个处理看起来不怎么优雅,有重复的代码
那么有没有一种办法能够让代码没有那么多重复的代码而且效率一样好呢?
有,这个方法就是将比较拆分,单独比较大于、等于和小于三种情况,
然后综合起来就能得到比较的结果了,如何比较,请看下面的代码:

package cn.lancy.util.dynamic;

/*
*一个用于动态比较的比较符号enum
*/
public enum CompareOperator{
  less      (true,  false, false), //小于
  lessequal (true,  true,  false), //小于等于
  equal     (false, true,  false), //等于
  greatequal(false, true,  false), //大于等于
  great     (false, false, true),  //大于
  notequal  (true,  false, true);  //不等于
  private boolean isNotLess = false;
  private boolean isNotEqual = false;
  private boolean isNotGreat = false;
  //私有的构造函数, 有三个参数,均为boolean类型
  //实际上是将每一种比较符分解为三种基本比较
  //不大于,不等于,不小于  
  private CompareOperator(boolean isLess, boolean isEqual, boolean isGreat){
   this.isNotLess = !isLess;
   this.isNotEqual = !isEqual;
   this.isNotGreat = !isGreat;
  }
  //执行比较的方法,
  public boolean execute(Comparable a, Object b){
   //获得比较值
   int k = -1;
   if(a==null){
    if(b==null)k=0;
   }else{
    k = a.compareTo(b);
   }
   //执行比较,如果k值与基本比较要求的不一致,
   //则不符合本比较的条件,返回false
   if(this.isNotLess && k < 0)return false;
   if(this.isNotEqual && k == 0)return false;
   if(this.isNotGreat && k > 0)return false;
   //只有完全通过了这三次基本比较要求,那么才算通过了本方式的比较
   return true;
  }
 }

使用方式如下:

  Integer a = 100, b= 200;
  for(CompareOperator comparor: CompareOperator.values()){
    System.out.println(comparor.name() + "  ==>  " + comparor.execute(a, b));
  }

执行将返回:
less  ==>  true
lessequal  ==>  true
equal  ==>  false
greatequal  ==>  false
great  ==>  false
notequal  ==>  true

如此则代码中不存在重复代码,而比较的方式可以在程序中随意设定

(今日开张,以此为纪:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息