基于几个标志的条件

时间:2016-09-23 16:37:12

标签: java refactoring dry

我希望重构看起来像这样的Java代码。 a,b,c和d是布尔标志。

if(a && b && c && d) doA();
else if (a && b && c && !d) doB();
else if (a && b && !c && d) doC();
else if (!a && !b && c && d) doD();

等等,适用于所有16种组合。有没有更好的办法?我考虑使用值作为方法参考的Map,但形成键仍然是个谜。

1 个答案:

答案 0 :(得分:3)

创建函数数组,

public class FunctionTypes {
    public void func() {}
}

  .....

    FunctionTypes[] functions = new FunctionTypes[] {
            new FunctionTypes() { 
                public void func() { f1(); }

                public void f1() {
                    // handle case #1
                } 
            },
            new FunctionTypes() { 
                public void func() { f2(); }

                public void f2() {
                    // handle case #2
                } 
            },
            new FunctionTypes() { 
                public void func() { f3(); }

                public void f3() {
                    // handle case #3
                } 
            },
            new FunctionTypes() { 
                public void func() { f4(); }

                public void f4() {
                    // handle case #4
                } 
            },
            ....
        };

    // invoke case #0
    functions[0].func();  

    // invoke case #1
    functions[1].func();

选择索引,使用a,b,c,d中的位

   index = 0;
   index |= a;
   index |= b << 1;
   index |= c << 2;
   index |= d << 3;
好像他们在计算所有16个案件。或者,您可以从主类继承16个不同的子类,并覆盖每个不同子类中的方法,并使用顶级数组选择这些类的实例。也许实现一个接口可能更好。

我不知道java的地图是否有访问时间O(n * logn)但数组访问是否为O(1)。