有个接口,例如
public interface R{
    public boolean isOk(Form form);
}
根据实际情况我有很多种实现此接口的方式
T1,T2,T3每一个实现无非就是返回一个boolean结果,而且每个结果之间是可以进行逻辑运算符组合的
例如
T1.isOk()&&T2.isOk()||T3.isOk()得到一个最终的结果,每个逻辑运算符都是可以配置的
我现在要的是如何通过配置得得最终的结果
以上是3个实现,实际很有些。

解决方案 »

  1.   

    用Java的Expr4J包,不光是逻辑运算,什么表达式都能计算。
      

  2.   

    逻辑运算符也要动态配置?
    写个方法,按照一定的约束返回组合策略,比如
    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); //返回 对应策略溢出时的返回值
      

  3.   

    那我如何得到strategy 参数的值啊,我只能得到各个实现中间配置的逻辑运算符
      

  4.   

    boolean result = false;
     //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的结果做运算,循环下去,最后一个不运算
      

  5.   

    标准的Jar包都做出来了,为什么要自己去写呢http://sjsky.iteye.com/blog/670250建议LZ看看这篇文章
      

  6.   


    既然可以获得对象数组中运算符属性,那么你这样做不也可以吗?如果要得到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;
        }
    }
      

  7.   

    标准的Jar包都做出来了,哪个JAR包我试了,只能支持数字运算,不能支持逻辑判断组合
    类似true || false && true这样的都不行,而且是在JDK1.6下运行,1.5的JDK不能运行
     qybao兄弟的方法可以,我在试下,谢谢了,呵呵
      

  8.   

    JDK1。6下可以用javax.script.x包中的
    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实际上就是将这个包放加近来了