两个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
如此则代码中不存在重复代码,而比较的方式可以在程序中随意设定
(今日开张,以此为纪:)
如:
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
如此则代码中不存在重复代码,而比较的方式可以在程序中随意设定
(今日开张,以此为纪:)
相关文章推荐
- java中两个字符串如何比较大小
- Java代码的静态编译和动态编译中的问题比较(1)
- 比较编译技术--Java 代码的静态编译和动态编译中的问题
- Java面试题 两个String如何比较是否相等的
- java中两个字符串如何比较大小
- Java如何定位占用CPU比较高的问题
- 关于 "java 如何调用Oracle存储过程中的动态refcursor结果集" 问题
- java中两个字符串如何比较大小
- java中两个字符串如何比较大小
- java对cookie的操作比较简单,主要介绍下建立cookie和读取cookie,以及如何设定cookie的生命周期和cookie的路径问题。
- 比较编译技术--Java 代码的静态编译和动态编译中的问题
- Java代码的静态编译和动态编译中的问题比较
- 学习Java的第一步是安装好JDK,写一个Hello World, 其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加
- 如何用java比较两个时间或日期的大小
- java中用==比较两个字符串问题
- C#中比较两个对象的地址是否相同(也是引用计数的问题,和Java一样)
- 如何用java比较两个时间或日期的大小
- 如何比较两个二维数组是否相等 - 回复 "阿拉丁" 的问题
- Java中比较两个字符串是否相等的问题
- Java中比较两个字符串是否相等的问题