可能重复:
What is the best way to replace or substitute if..else if..else trees in programs?
如何避免多重if条件?例如:
Public void search(String a,b,c,d,e)
String aTerm;
现在哪个传递参数的单个和多个组合包含“aTerm”?例如,输出可能如下:
1 - aTerm appears in "a" only
2 - aTerm appears in "a,c", and "e"
3 - aTerm appears in "d" and "e"
对于每个单独或可能的组合,我想调用特定的功能。我写了很多条件,但看起来很糟糕。例如:
If(aTerm. equalsIgnoreCase(a)){ call function a();}
If(aTerm. equalsIgnoreCase(b)){ call function b();}
If(aTerm. equalsIgnoreCase(b) and aTerm. equalsIgnoreCase(b)){ call function ab();}
…………………… and so on………………………….
有没有更清洁的方法呢?解决方案可以是PHP或Java。
答案 0 :(得分:1)
构建一个字符串并按字符串的名称调用该方法:
// Psuedo-code
str = "";
If( aTerm.equalsIgnoreCase(a)) str += "a";
If( aTerm.equalsIgnoreCase(b)) str += "b";
If( aTerm.equalsIgnoreCase(c)) str += "c";
If( aTerm.equalsIgnoreCase(d)) str += "d";
If( aTerm.equalsIgnoreCase(e)) str += "e";
call function named by str
答案 1 :(得分:1)
多态性可以取代ifs / switch:
interface LogicWithMatcher {
boolean match(String aTerm);
void yourFunction();
}
class MatcherA implements LogicWithMatcher() {...}
class MatcherB implements LogicWithMatcher() {...}
class MatcherC implements LogicWithMatcher() {...}
class MatcherD implements LogicWithMatcher() {...}
class MatcherE implements LogicWithMatcher() {...}
如果必须将一个函数与给定输入匹配:
public LogicWithMatcher search(String yourString) {
LogicWithMatcher[] logics = {new MatcherA(), new MatcherB ...}
for (LogicWithMatcher logic : logics) {
if (logic.match(yourString))
return logic;
return null;
}
String yourString = "....."
LogicWithMatcher logic = search(yourString);
if (logic != null)
logic.yourFunction();
else
print("nothing matched");
或者,如果您的给定输入可能匹配多个功能:
public void runFunctionsFor(String yourString) {
LogicWithMatcher[] logics = {new MatcherA(), new MatcherB ...}
for (LogicWithMatcher logic : logics) {
if (logic.match(yourString))
logic.yourFunction();
}
String yourString = "....."
runFunctionsFor(yourString);
答案 2 :(得分:0)
我可能会这样做:
public class YourClass {
static Runnable[] targets = new Runnable[32];
public void search(String a, String b, String c, String d, String e) {
int tgt = 0;
if(a.indexOf(aTerm) >= 0) tgt |= 1;
if(b.indexOf(aTerm) >= 0) tgt |= 2;
if(c.indexOf(aTerm) >= 0) tgt |= 4;
if(d.indexOf(aTerm) >= 0) tgt |= 8;
if(e.indexOf(aTerm) >= 0) tgt |= 16;
targets[tgt].run();
}
}
然后,只需在Runnable
中包装要运行的各种函数,并将它们存储在targets
中的相应索引处。我很确定这会比使用反射的东西表现得更好。
答案 3 :(得分:0)
有没有更干净的方法呢?
我认为简短的回答是“不”。
有许多方法可以在Java中对此进行编码,以避免显式的if / else语句链,但最终结果通常比原始代码更复杂。在我看来,“干净”的代码应该意味着代码容易(更容易)阅读。
在您的示例中,您具有固定的方法签名和固定的谓词结构。 IMO,if / else链是Java中的自然解决方案。