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

Java 将多个选项与特定条件匹配,java,conditional,conditional-statements,Java,Conditional,Conditional Statements,我试图实现的是将多个布尔选项与匹配条件相匹配。到目前为止,这是我的设计。我对它不满意。如何有效地编写与条件匹配的多选项?或者有多个选项是一种主要的代码气味 class Condition { Boolean a; // Optional Boolean b; // Optional Boolean c; // Optional boolean d; // mandatory Condition(Boolean a, Boolean b, Boolean

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

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) 传递
null
o以满足构造函数调用以创建实例,这不是一种好的做法

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

因此,上述问题的答案如下所示:

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

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


重要的一点是,这两种解决方案可能无法完全解决您的冗长问题,即避免
if
检查或条件(因为它们是您的核心逻辑的一部分)。但是,这些更正将引导您朝着正确的方向前进,并使您的代码更结构化(因此更少混乱),并且易于阅读和维护

我怀疑有一种更高效(速度)和优雅的方式(更少 详细)使用较少的构造函数参数实现相同的功能,以及 我也不喜欢所有条件的循环和打破寻找 第一个匹配的

显然,您当前的代码几乎没有问题,如下所示:

(1) 传递
null
o以满足构造函数调用以创建实例,这不是一种好的做法

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

因此,上述问题的答案如下所示:

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

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



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

您能否澄清-您特别不满意此代码的哪一部分?我怀疑有一种更高效(速度)和优雅(不太冗长)的方法使用较少的构造函数参数实现同样的效果,而且我不喜欢所有条件的循环和中断以找到第一个匹配的条件是方法调用
someTestLogic1()
,等等。。。在
for
循环中,是否正确?原因是,所有这些方法看起来都像零参数方法,那么它们如何
返回
diff.
boolean
值呢?我的意思是他们能在循环之外吗?@javaguy我修改了代码。这些方法只是虚设的方法,用来表示它的动态性可以让你弄清楚-你特别不满意这段代码的哪一部分?我怀疑有一种更高效(速度)和优雅(不太冗长)的方法可以用更少的构造函数参数来实现同样的效果,而且我不喜欢所有条件的循环,也不喜欢为了找到第一个匹配的条件而中断方法调用
someTestLogic1()
,等等。。。在
for
循环中,是否正确?原因是,所有这些方法看起来都像零参数方法,那么它们如何
返回
diff.
boolean
值呢?我的意思是他们能在循环之外吗?@javaguy我修改了代码。这些方法只是表示其动态特性的虚拟方法