2011-03-25 153 views
0

我写一个Java应用程序来处理日志文件已数百万行 在方案有这样的伪代码如何避免重复的if语句?

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对我来说是不愉快的。 这是一个很好的方式来解决这个恼人的IFs?

+3

您是否担心1)该方法的可扩展性(您不断添加'if'语句),2)该方法的美学(你不想阅读所有这些陈述),3)方法的表现(它太慢),或这些的组合?如果你更清楚**为什么**你想减少'if's的数量,我们可以帮助更多 – templatetypedef 2011-03-25 08:47:37

+0

不知道java,但不能使用接口/虚拟方法,并使用列表选项..类似于''for(i = 0; i stefan 2011-03-25 08:49:00

回答

1

如果对象共用一个接口,你可以这样创建一个方法:

private void callOptional(myInterface obj, boolean flag) { 
    if (option) obj.method(); 
} 

你排除了所有的国际单项体育联合会的方式。但是你仍然有一长串的通用代码。为了使它更干,我的对象引用添加到您存储的选项,然后只为循环做一个列表:

for (OptionObjectPair ooPair : optionObjectList) { 
    callOptional(ooPair.obj, ooPair.flag) 
} 

然后,您可以甚至改变callOptional方法的接口取的OptionObjectPair直接。

+0

Uhu,每个对象都没有选择,正在优化? Java很有趣? – stefan 2011-03-25 09:09:39

+0

@stefan:是的,这不像是JVM会内联方法 - 不,不要担心,我们只做40年的优化,而不是30年的优化:p – Voo 2011-03-25 10:24:22

0

如果所有对象的方法都是相同的,则创建一个选项到对象的散列表并根据该选项调用方法。的if声明

HashMap<Option,ActionObject> map ; 
for (Option option: map.keySet()) { 
    if (optionIsTrue(option)) { 
     map.get(option).performAction() ; 
    } 
} 
+0

为什么使用hashmap而不仅仅是数组/矢量? – stefan 2011-03-25 09:10:38

+0

这只解决了一半的问题:只有当一个'Option'实例为真时,他才需要调用'performAction()' – MarcoS 2011-03-25 09:14:42

+0

@stefan,因为如果你使用一个数组,你必须保留两个数组,并且从option根据索引来对象。 – euphoria83 2011-03-25 18:45:00

0

长序列不是总是一件坏事。如果你想这样做正确的方式虽然,你必须定义你的选项到数据结构中的“处理程序”的映射,而不是在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语句序列10

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