java中if语句的替代方法
我很想看到任何替代常规if语句的方法,例如java中if语句的替代方法,java,if-statement,Java,If Statement,我很想看到任何替代常规if语句的方法,例如 if(x) do a; if(y) do b; if(z) do c; 正如你看到的,所有if语句都是独立的,没有其他条件。请注意,X Y Z是完全分离的条件,因此开关不适合。这是最简单、可读性最强但有效的解决方案。在这里看到有效的替代方案,我会感到惊讶 编辑 您可以尝试应用提取方法多次: doAIfX(); doBIfY(); doCifZ(); 其中,方法定义如下: void doAIfX() { if (!
if(x)
do a;
if(y)
do b;
if(z)
do c;
正如你看到的,所有if语句都是独立的,没有其他条件。请注意,X Y Z是完全分离的条件,因此开关不适合。这是最简单、可读性最强但有效的解决方案。在这里看到有效的替代方案,我会感到惊讶 编辑 您可以尝试应用提取方法多次:
doAIfX();
doBIfY();
doCifZ();
其中,方法定义如下:
void doAIfX() {
if (!X) {
return;
}
// do 'a'
}
这取决于x,y,z和a,b,c是什么。有时如果语句更合适。有时多态性更合适。Java中的
if-else
的替代方法是switch语句和(?:)操作符,它们都不能完全满足您的要求(只处理if
而不处理else
)。在我看来,你发布的代码是最好的方法。使用多态性
interface SomethingDoer {
public void doSomething();
}
class ADoer implements SomethingDoer { ... }
class BDoer implements SomethingDoer { ... }
class CDoer implements SomethingDoer { ... }
public class Main {
public static void main (String[] args) {
SomethingDoer doer = new SomethingDoerFactory(args).getDoer();
doer.doSomething();
}
}
if并没有完全消除,但它被转移到了某个ThingDoerFactory。此解决方案并不适用于所有情况,但在某些情况下,它是多个ifs的一个非常好的替代方案
下面是一个很好的话题:一个“真正面向对象”的答案是为“规则”(使用条件()和操作()方法)定义一个接口,创建3个实现,将它们填充到一个集合中,然后按照如下所示的一般方式对它们进行迭代: List<Rule> rules = .... ; // your 3 rules initialized here somehow for(Rule r : rules) { if(r.condition()) { r.action(); } }
简而言之,答案是肯定的 有几次您可以避免将if用于条件求值和分支。 他们有适当的时机
你需要在某处有这些if语句
正如其他人所建议的,可以将它们重构为其他方法,以保持当前方法的干净。如果您需要在许多地方重复使用相同的If语句集,那么可能会使用。这听起来是使用闭包的完美案例。但是你需要groovy或者类似的东西。那么。。。 我的动画师(东西,位置,速度| computeSpeed())
如果速度===未定义,则将计算速度。。。我想。这真的取决于上下文。。。但如果else只是java中控制流语句的一个,那么是的:
执行类似操作,实现基于条件的枚举并调用覆盖方法
public enum Rule{
a(){
@Override
public void do(){
// do something.
}
},
b(){
@Override
public void do(){
// do something.
}
},
c(){
@Override
public void do(){
// do something.
}
public abstract void do();
}
}
public class Test{
public static void main(String[] args){
Rule r = Rule.valueOf("a");
r.do();
}
}
虽然好奇可能很幽默。。。为什么我想要一个if的替代方案,特别是当条件是开关不合适时?好像Java还不够臃肿……要么你想做的事情很愚蠢(如果真的很棒!),要么你需要提供更多信息。我可以想象这样一种情况,在这种情况下,类似这样的代码可以通过消息传递模式或其他有趣的方式进行处理(前提是您的情况并不像您所解释的那么简单)。您希望这种替代方案提供什么,而所呈现的代码却无法提供什么?(字符越少,可读性越好?@Hellnar:有额外的知识有价值,还有晦涩难懂的代码。如果有足够多的
语句是有害的,那么对你为什么投否决票有什么评论吗?这不是另一种选择吗?还是说它不够好?如果我的条件已经基于类型,我只会考虑一个多态的解决方案。我不会创建一个完整的类层次结构来替换,如果(x)做一个代码>如果在许多情况下,这是有意义的。见-谷歌技术会谈。(干净代码会谈-继承,多态性,和测试),我认为下注错误。直接从MISKO的幻灯片:“有时,<代码>如果< /COD>只是一个<代码>如果< /代码>”。除非在很多地方重复使用这些if语句,否则这将使事情变得不必要的复杂。另外:您的解决方案不完整。如果x和y两个条件都成立呢?你错过了一个,一个,一个,一个,一个,一个,一个;这些都被原始代码很好地涵盖了,显然这完全取决于“做一件事”意味着什么。多态性可能是一个很好的解决方案,但是这个示例太通用了,无法为所有情况提供单一的解决方案。AAndBDoer等通常通过使用多态类型解决方案的装饰器/组合模式来解决。我在固件中为一个可以启用或禁用许多不同选项的设备执行此操作。我宁愿让我的main()调用像doFooIfEnabled()这样的东西,也不愿让它被大量的ifs和#ifdef弄得乱七八糟。像任何模式一样,有时应该使用它,有时不应该。你可以使用一个映射来表示O(1)次,而不是O(n)。映射在这里不起作用,因为每个规则实现的条件都是唯一的。Map需要实际的键,而不是隐藏在可调用方法中的某些代码。三元函数中有多个条件:
// Example:
if (a==1) { b=2; }
if (a==2) { b=17; }
// Becomes
int fx(2); // our array of answers
fx[0] = 2;
fx[1] = 17;
b = fx[ a - 1 ];
// Example:
if (a==1) { doSomething1(); }
if (a==2) { doSomething2(); }
// Becomes
function * fx(2); // our array or better still, list of functions
fx[0] = &doSomething1;
fx[1] = &doSomething2;
`fx[ a - 1 ](); `
if (thisCondition == true) {
b = true;
} else {
b = false;
}
public enum Rule{
a(){
@Override
public void do(){
// do something.
}
},
b(){
@Override
public void do(){
// do something.
}
},
c(){
@Override
public void do(){
// do something.
}
public abstract void do();
}
}
public class Test{
public static void main(String[] args){
Rule r = Rule.valueOf("a");
r.do();
}
}