我怎样才能避免重复的if语句?

时间:2011-03-25 08:40:21

标签: java optimization if-statement

我写了一个java应用程序来处理日志文件有数百万行 在程序中有这样的伪代码

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?

4 个答案:

答案 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语句中硬编码。

您可以定义单方法界面,并ABC(在您的示例中)实现它:

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();
}