有个接口,例如
public interface R{
public boolean isOk(Form form);
}
根据实际情况我有很多种实现此接口的方式
T1,T2,T3每一个实现无非就是返回一个boolean结果,而且每个结果之间是可以进行逻辑运算符组合的
例如
T1.isOk()&&T2.isOk()||T3.isOk()得到一个最终的结果,每个逻辑运算符都是可以配置的
我现在要的是如何通过配置得得最终的结果
以上是3个实现,实际很有些。
public interface R{
public boolean isOk(Form form);
}
根据实际情况我有很多种实现此接口的方式
T1,T2,T3每一个实现无非就是返回一个boolean结果,而且每个结果之间是可以进行逻辑运算符组合的
例如
T1.isOk()&&T2.isOk()||T3.isOk()得到一个最终的结果,每个逻辑运算符都是可以配置的
我现在要的是如何通过配置得得最终的结果
以上是3个实现,实际很有些。
解决方案 »
- Java 对外接口开发要求?
- 关于spring的自动装配问题
- java解析dbf格式时里面数据类型怎么判断,急急。。
- SSH 不进Action
- 项目保存时候出错
- request.getHeader("Referer")中的Referer是从哪里来的?
- 问个比较大白的问题,关于struts2的问题;
- spring问题?
- j2sdk1.4.2算是j2se多少版本啊?
- 关于middlegen + hbm2java生成java文件的问题
- 请教下大家,在开发项目中对于复杂一点的权限管理。。一般是怎么处理。。
- MyEclipse下新建一个 EJB Project和Web Project的区别是什么?JSP/Servlet等组件可以部署在EJB Project下面吗?
写个方法,按照一定的约束返回组合策略,比如
T1,T2,T3组合,传入一个整数表示组合策略,该整数以二进制的方式检验,当某位的二进制数为0,则&&,为1则||
public boolean getState(R[] r, int strategy) {
int full = 1; //用于检验传入的策略整数是否溢出
for (int i=0; i<r.length-1; i++) { //运算符号数比操作数少1,所以是r.length-1
full &= (1<<i);
}
if (stracety > full) { //溢出的情况下,根据实际情况返回
return false; //这里以false返回为例
}
boolean state = r[0].isOk();
for (int i=1; i<r.length; i++) {
int bit = ((strategy >> r.length-i) & 1);
if (bit == 0) {
state = state && r[i].isOk();
} else {
state = state || r[i].isOk();
}
} return state;
}//调用
R[] r = {T1, T2, T3}; //3个接口实现,所以符号个数为2,即2位的二进制,最大策略为0x11=3
strategy = 0; //二进制为00
boolean state = getState(r, strategy); //返回 T1.isOk()&&T2.isOk()&&T3.isOk()int strategy = 1; //二进制为01
boolean state = getState(r, strategy); //返回 T1.isOk()&&T2.isOk()||T3.isOk()strategy = 2; //二进制为10
boolean state = getState(r, strategy); //返回 T1.isOk()||T2.isOk()&&T3.isOk()strategy = 3; //二进制为11
boolean state = getState(r, strategy); //返回 T1.isOk()||T2.isOk()||T3.isOk()strategy = 4; //二进制为100,超出符号个数,溢出
boolean state = getState(r, strategy); //返回 对应策略溢出时的返回值
//objects自定义的对象数组,对象里面包含className属性,逻辑运算符属性
for (int i = 0; i < objects.size(); i++) {
try {
if (i != objects.size() - 1) {
AuthHandler leftAuthHandler = (AuthHandler) Class.forName(
objects.get(i).getClassName()).newInstance();
AuthHandler rightAuthHandler = (AuthHandler) Class.forName(
objects.get(i + 1).getClassName()).newInstance();
if (objects.get(i).getPloy().equals("and")) {
result = leftAuthHandler.auth(null)
&& rightAuthHandler.auth(null);
} else {
result = leftAuthHandler.auth(null)
|| rightAuthHandler.auth(null);
}
System.out.println(result);
}
} catch (InstantiationException e1) {
result=false;
} catch (IllegalAccessException e1) {
result=false;
} catch (ClassNotFoundException e1) {
result=false;
}
}
System.out.println("**************************");
System.out.println("the final result is :" + result);
数组最后的一个对象配置的逻辑运算符无效
例如
1 && 2 || 3 && 4 || 5 && 5后面的哪个没意思
整个意思就是将1与2的结果再跟2与3的结果做运算,循环下去,最后一个不运算
既然可以获得对象数组中运算符属性,那么你这样做不也可以吗?如果要得到strategy,也可以循环中计算
int strategy = 0;
for (int i = 0; i < objects.size()-1; i++) {
strategy << 1;
if ("and".equals(objects.get(i).getPloy())) {
//
} else {
strategy += 1;
}
}
类似true || false && true这样的都不行,而且是在JDK1.6下运行,1.5的JDK不能运行
qybao兄弟的方法可以,我在试下,谢谢了,呵呵
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("javascript");
Object res = engine.eval("4*4+3");//表达式
System.out.println(res);
类似上面的语句执行,得到不同类型的结果,
http://blog.chinaunix.net/space.php?uid=540802&do=blog&cuid=417006
JDK1。5下则不行,不支持javax.script,需要用到Rhino提供的js.jar包,JDK1。6实际上就是将这个包放加近来了