java - 基于多个标志的条件

标签 java refactoring dry

我希望重构如下所示的 Java 代码。 a、b、c 和 d 是 boolean 标志。

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 种组合。有没有更好的办法?我考虑过将值作为方法引用的映射,但形成键仍然是一个谜。

最佳答案

创建函数数组,

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 个不同的子类,并重写每个不同子类中的方法,并使用顶级类数组选择这些类的实例。也许实现一个接口(interface)可能会更好。

我不知道java的map访问时间是不是O(n*logn),但是数组访问时间是O(1)。

关于java - 基于多个标志的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39665648/

相关文章:

java - 用户支持的分配未满足跨步要求,退回到单独分配

Java:文件菜单点击是否获得焦点?

Java Mail超时和连接超时处理

java - 如何在不违反 DRY 原则的情况下检查接口(interface)方法中的参数

java - 将生成的 Zip 的 Zip 提供给客户端

c++ - 每个编译单元是否只有一个未命名的命名空间?

javascript - 如何修复我多余的 jQuery

ruby-on-rails - Rails 复杂 if

php - Codeigniter - View 不违反 DRY 的最佳实践

C++:避免​​继承层次结构中的双重维护