将多个选项与特定条件匹配

时间:2017-04-12 19:07:22

标签: java conditional conditional-statements

我想要实现的是将多个布尔选项与匹配条件匹配。到目前为止,这是我的设计。我对它不满意。如何有效地编写与条件匹配的多个选项?或者有多种选择主要代码味道?

class Condition 
{
    Boolean a; // Optional
    Boolean b; // Optional
    Boolean c; // Optional
    boolean d; // mandatory

    Condition(Boolean a, Boolean b, Boolean c, boolean d) 
    {
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
    }

    public boolean matches(Boolean a, Boolean b, Boolean c, boolean b) 
    {
        return (a == null || this.a == a) 
               && (b == null || this.b == b)
               && (c == null || this.c == c)
               && (this.b == b);
    }   

    public static void main(String args[]) {
         Condition c1 = new Condition(true, true, null, true);
         Condition c2 = new Condition(null, null, false, false);
         Condition c3 = new Condition(false, true, null, true);
         Condition[] conditions = new Condition[]{c1,c2,c3};

         for (Condition con : conditions) {
             Boolean a = someTestLogic1(...);
             Boolean b = someTestLogic2(...);
             Boolean c = someTestLogic3(...);
             boolean d = someTestLogicMandatory(...);

             if (con.matches(a,b,c,d)) {
                 // found the matching condition
                 return con;
             }
         }             
    }
} 

1 个答案:

答案 0 :(得分:0)

  

我怀疑有更高效(速度)和优雅的方式(更少   用较小的构造函数参数实现相同的,并且   我也不喜欢所有条件的循环和破坏   第一个匹配的。

目前的代码显然存在少数问题,如下所示:

(1)传递null o满足构造函数调用以创建实例,这不是一个好习惯。

(2)即使您正在检查相同类型的两个对象的相等性,也不使用equals()方法。

因此,上面出现的问题答案如下:

(1)您可以使用Builder pattern来解决第一个问题

(2)显然,您需要覆盖equals()中的hashcode()java.lang.Object方法,以匹配两个对象的相等性。

重要的一点是,这两个解决方案可能无法完全解决您的问题,即避免if检查或条件(因为它们是您的核心逻辑的一部分)。但是,这些更正将引导您朝着正确的方向前进,使您的代码更加结构化(因此不那么混乱),并且可以轻松读取和读取保持。