我希望重构如下所示的 Java 代码。 a、b、c 和 d 是 boolean 标志。
if(a && b && c && d) doA();
else if (a && b && c && !d) doB();
else if (a && b && !c && d) doC();
else if (!a && !b && c && d) doD();
等等,对于所有 16 种组合。有没有更好的办法?我考虑过将值作为方法引用的映射,但形成键仍然是一个谜。
最佳答案
创建函数数组,
public class FunctionTypes {
public void func() {}
}
.....
FunctionTypes[] functions = new FunctionTypes[] {
new FunctionTypes() {
public void func() { f1(); }
public void f1() {
// handle case #1
}
},
new FunctionTypes() {
public void func() { f2(); }
public void f2() {
// handle case #2
}
},
new FunctionTypes() {
public void func() { f3(); }
public void f3() {
// handle case #3
}
},
new FunctionTypes() {
public void func() { f4(); }
public void f4() {
// handle case #4
}
},
....
};
// invoke case #0
functions[0].func();
// invoke case #1
functions[1].func();
要选择索引,请使用 a、b、c、d 中的位
index = 0;
index |= a;
index |= b << 1;
index |= c << 2;
index |= d << 3;
好像他们正在清点所有 16 个病例。或者,您可以从主类继承 16 个不同的子类,并重写每个不同子类中的方法,并使用顶级类数组选择这些类的实例。也许实现一个接口(interface)可能会更好。
我不知道java的map访问时间是不是O(n*logn),但是数组访问时间是O(1)。
关于java - 基于多个标志的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39665648/