if(optionA is On)
call object A's method
if(optionB is On)
call object B's method
if(optionC is On)
call object C's method
...
IF中的选项是来自配置文件的配置值 这个伪代码在每个日志行中调用,因此它调用了数百万次
由于速度和简单性,我想删除这个多IF。 看到这么多的IF对我来说是不愉快的。 这是一个很好的方式来解决这个烦人的IF?
答案 0 :(得分:1)
如果对象共享一个公共接口,您可以创建一个这样的方法:
private void callOptional(myInterface obj, boolean flag) {
if (option) obj.method();
}
这样你就消除了IF。但是你仍然有一长串公共代码。为了使它更干,我将对象引用添加到存储选项的列表中,然后只需执行for循环:
for (OptionObjectPair ooPair : optionObjectList) {
callOptional(ooPair.obj, ooPair.flag)
}
然后,您甚至可以更改callOptional方法的接口以直接获取OptionObjectPair。
答案 1 :(得分:0)
如果所有对象的方法相同,则创建一个选项到对象的哈希表,并根据该选项调用该方法。
HashMap<Option,ActionObject> map ;
for (Option option: map.keySet()) {
if (optionIsTrue(option)) {
map.get(option).performAction() ;
}
}
答案 2 :(得分:0)
if
语句的长序列不总是是坏事。如果你想以正确的方式,,你必须在数据结构中定义你的选项到它们的“处理程序”的映射,而不是在if语句中硬编码。
您可以定义单方法界面,并A
,B
和C
(在您的示例中)实现它:
public interface OptionHandler { // For lack of a better name...
void handleOption(); // You could pass parameters here
}
然后,您可以为其处理程序定义选项的映射:
private final Map<Option, OptionHandler> optionHandlers = new HashMap<Option, OptionHandler>();
然后,您将使用以下内容替换if
语句序列:
for (Option option : options) {
if (!option.isOn()) {
// Skip off option
continue;
}
OptionHandler handler = optionHandlers.get(option);
if (handler != null) {
handler.handleOption();
}
}
答案 3 :(得分:0)
这实际上取决于您想要优化的内容(请参阅templatetypedef的评论)。如果您只是想减少代码占用空间,可以执行类似这样的操作
// let's assume you have an Option interface with isTrue() method
// let's assume you have an Action interface with performAction() method
Map<Option,Action> actions = new HashMap<Option,Action>();
// initialize actions with instance of your objects so that you have:
// optionA -> actionA
// optionB -> actionB
// etc.
// this is done only once
Option[] currentOptions;
// read the current option values and put them in an array
for (int i = 0; i < currentOptions.lengt; i++) {
if (currentOptions[i].isTrue())
actions.get(currentOptions[i]).performAction();
}