我想要实现的是将多个布尔选项与匹配条件匹配。到目前为止,这是我的设计。我对它不满意。如何有效地编写与条件匹配的多个选项?或者有多种选择主要代码味道?
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;
}
}
}
}
答案 0 :(得分:0)
我怀疑有更高效(速度)和优雅的方式(更少 用较小的构造函数参数实现相同的,并且 我也不喜欢所有条件的循环和破坏 第一个匹配的。
目前的代码显然存在少数问题,如下所示:
(1)传递null
o满足构造函数调用以创建实例,这不是一个好习惯。
(2)即使您正在检查相同类型的两个对象的相等性,也不使用equals()
方法。
因此,上面出现的问题答案如下:
(1)您可以使用Builder pattern来解决第一个问题
(2)显然,您需要覆盖equals()
中的hashcode()
和java.lang.Object
方法,以匹配两个对象的相等性。
重要的一点是,这两个解决方案可能无法完全解决您的问题,即避免if
检查或条件(因为它们是您的核心逻辑的一部分)。但是,这些更正将引导您朝着正确的方向前进,使您的代码更加结构化(因此不那么混乱),并且可以轻松读取和读取保持。