Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中if语句的替代方法_Java_If Statement - Fatal编程技术网

java中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语句的方法,例如

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用于条件求值和分支。 他们有适当的时机

  • 多态性,当行为依赖于初始值时
  • 参考赋值,当您知道可能的初始值并且它们与返回值具有1:1的相关性时。在这方面,列表比数组好,但是…

  • 参考分支,当您知道可能的初始值并且它们与要使用的函数/分支具有1对1的相关性时。(示例不是Java)

  • 直接布尔赋值

    我们痛恨:

    应该是:

    b=这种情况


  • 你需要在某处有这些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();
                }
            }