在我的代码中,我正在评估3个布尔值
这些布尔值真值的每种组合都需要不同的动作(例如,应该执行不同的方法)
目前我正在使用if-else块(8个选项,不太好)。
我想知道是否有另一种选择来编写这个代码,这将使它“更漂亮”
也许设计模式?
有人有想法吗?
答案 0 :(得分:3)
使用开关块
switch ((A?4:0) + (B?2:0) + (C?1:0)){
case 0: //A,B,C false
break;
case 3: //A False, B,C true
break;
case 4: //A True, B,C false
break;
}
答案 1 :(得分:3)
我建议您使用command pattern。
public interface Command {
void exec();
}
public class CommandA() implements Command {
void exec() {
// ...
}
}
构建Map对象并使用Command实例填充它:
然后你可以通过迭代地图来做你喜欢的事情。
commandMap.get(value).exec();
答案 2 :(得分:1)
三个要素并不算太差,但是如果你的桌子包含4或5或25怎么办?可以变得复杂。 这是一种紧凑的技术,有些人会发现有用,而其他人会击落。
构建表元素的字符串:
final boolean a = false, b = false, c = false;
final String method = "state"+(a?"AT":"AF")+(b?"BT":"BF")+(c?"CT":"CF");
这会生成如下字符串:
// stateAFBFCF
// stateAFBTCF
// stateAFBFCT
...
使用相同的名称创建方法来处理每个状态组合:
public void stateAFBTCF() { }
public void stateAFBTCF() { }
public void stateAFBFCT() { }
...
使用反射来调用正确的方法:
final Class<?> _class = handler.getClass();
final Method _method = _class.getDeclaredMethod(methodName, new Class[] {});
_method.invoke(handler, new Object[] { });
答案 3 :(得分:0)
如果您拥有尽可能多的方法组合,您可以检查不同方法入口处的组合:
public void a(boolean a, boolean b, boolean c) {
if (a && !b && !c) {
}
}
public void ab(boolean a, boolean b, boolean c) {
if (a && b && !c) {
}
}
public void abc(boolean a, boolean b, boolean c) {
if (a && b && c) {
}
}
public void ac(boolean a, boolean b, boolean c) {
if (a && !b && c) {
}
}
public void b(boolean a, boolean b, boolean c) {
if (!a && b && !c) {
}
}
public void bc(boolean a, boolean b, boolean c) {
if (!a && b && c) {
}
}
public void c(boolean a, boolean b, boolean c) {
if (!a && !b && c) {
}
}
public void none(boolean a, boolean b, boolean c) {
if (!a && !b && !c) {
}
}
然后,只需打电话给所有人:
a(a, b, c);
ab(a, b, c);
abc(a, b, c);
ac(a, b, c);
b(a, b, c);
bc(a, b, c);
c(a, b, c);
none(a, b, c);