避免过多if-else的几种方法

标签: Java 代码优化 重构 枚举 lambda
8人阅读 评论(0) 收藏 举报
分类:

太多的if-else不太直观,难以维护。
以下面代码为例,展示几种替代if else的方法。

String input = "three";

    @Test
    public void testElse() {
        if ("one".equals(input)) {
            System.out.println("one");
        } else if ("two".equals(input)) {
            System.out.println("two");
        } else if ("three".equals(input)) {
            System.out.println("three");
        } else if ("four".equals(input)) {
            System.out.println("four");
        }
    }

需要引入Spring跟Guava依赖

1.Spring结合策略模式

Spring可以将一组实现了同样接口的类注入一个List

/***
 * 定义接口。type用来路由具体的Handler实现
 * */
public interface Handler {
    String getType();

    void execute();
}
  /**
     * 将Handler接口的实现类注入一个List
     * */
    @Autowired
    private List<Handler> handlerList;
    @Test
    public void testAutowireList(){
    // 根据类型判断该由哪个具体实现类处理
         for(Handler handler:handlerList){
             if(input.equals(handler.getType())){
                 handler.execute();
             }
         }
    }

下面是几种轻量级实现.

2. 反射

通过反射动态调用相应的方法

/***
 *定义每种类型所对应的方法
*/
public class ReflectTest {
    public void methodOne() {
        System.out.println("one");
    }

    public void methodTwo() {
        System.out.println("two");
    }

    public void methodThree() {
        System.out.println("three");
    }

    public void methodFour() {
        System.out.println("four");
    }

}

 /***
     *
     * 通过反射,动态调用方法。采用了Guava的工具类。
     * */
    @Test
    public void testReflect() throws Exception {
        //首字母大写,根据类型拼接方法
        String methodName = "method" + LOWER_CAMEL.to(UPPER_CAMEL, input);
        Method method = ReflectTest.class.getDeclaredMethod(methodName);
        Invokable<ReflectTest, Object> invokable =
                (Invokable<ReflectTest, Object>) Invokable.from(method);
        invokable.invoke(new ReflectTest());
    }

3. lambda表达式

实现同上面的反射,结合了Java 8的新特性:lambda表达式


    @Test
    public void testJava8() {
        Map<String, Consumer<ReflectTest>> functionMap = Maps.newHashMap();
        functionMap.put("one", ReflectTest::methodOne);
        functionMap.put("two", ReflectTest::methodTwo);
        functionMap.put("three", ReflectTest::methodThree);
        functionMap.put("four", ReflectTest::methodThree);
        functionMap.get(input).accept(new ReflectTest());
    }

4. 枚举

在枚举里面定义一个抽象方法,每种类型对应各自的具体实现。

/**
 * 定义枚举类,包含了所有类型
 */
public enum EnumTest {


    ONE("one") {
        @Override
        public void apply() {
            System.out.println("one");
        }
    },
    TWO("two") {
        @Override
        public void apply() {
            System.out.println("two");
        }
    }, THREE("three") {
        @Override
        public void apply() {
            System.out.println("three");
        }
    }, FOUR("four") {
        @Override
        public void apply() {
            System.out.println("four");
        }
    };

    public abstract void apply();

    private String type;

    EnumTest(String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }

}
  // 枚举测试
 @Test
    public void testEnum() {
        EnumTest.valueOf(input.toUpperCase()).apply();
    }
查看评论

设计模式快速入门-面试必用的几种

-
  • 1970年01月01日 08:00

代码中如何避免过多的if else

(转载)http://www.iteye.com/problems/87625 1、if层次越少越好  如  if() {  } else if() {  }  看看能不能改成  ...
  • zhuhai__yizhi
  • zhuhai__yizhi
  • 2016-02-18 17:42:03
  • 1306

避免使用if-else

 最近在研究一下怎样尽量少使用if-else,考虑到自己的使用情况,就想到了使用java中反射机制,可以达到自己的要求,更趋于OO设计。怎样使用java中的反射机制: 1.首先知道传给你的对象有几种出...
  • WPSKL1234
  • WPSKL1234
  • 2009-11-13 09:58:00
  • 491

过多if-else分支的优化

有一些朋友说if-else过多的分支可以使用switch或者责任链模式等等方式来优化。确实,这是一个小问题,不过我们还是可以整理一下这个小问题的重构方式。 为什么要优化? 你没有看错。这是要放在第...
  • xieyihong474189879
  • xieyihong474189879
  • 2014-08-18 16:41:12
  • 312

设计模式——行为型模式之借助策略模式(Strategy Pattern)减少使用不必要的if-else if -else和switch-case(三)

策略模式(Strategy Pattern)是一种比较简单的行为型模式——定义一组算法,将每个算法都封装起来,并且使它们之间可以互换(Define a family of algorithms,enc...
  • CrazyMo_
  • CrazyMo_
  • 2017-11-14 14:13:25
  • 690

活用设计模式:如何避免一连串的if else

前段时间知乎上有人发了这么个段子: 某日,老师在课堂上想考考学生们的智商,就问一个男孩: “树上有十只鸟,开枪打死一只,还剩几只?” 男孩反问:“是无声手枪,还是其他没有声音的枪么?” “不...
  • Dorrn
  • Dorrn
  • 2015-01-06 12:51:35
  • 283

策略模式:再见if-else

在软件开发中,我们时常用到if-else来对进行条件判断,然后再进行相应的操作,但这样做会使得项目再日后的维护中出现困难,所以,当遇到比较复杂的if-else结构的时候,使用策略模式是很好的选择 ...
  • qq_33487412
  • qq_33487412
  • 2018-01-07 12:15:25
  • 75

代替 if-else,switch-case 的几种方法

if-else,switch-case 是判断逻辑的语句,只要我们需要分支,就可能要用到这种语句,在 C 的编程风格中,更是动则需要这种判断语句,问题是这种判断语句如果多了,就会毁坏代码的可读性和维护...
  • dylgsy
  • dylgsy
  • 2006-10-18 15:39:00
  • 12513

解线性规划的单纯形算法中避免循环的几种方法

  • 2012年12月23日 20:58
  • 364KB
  • 下载

减少 if-else 嵌套的几种方法

减少该死的 if else 嵌套:https://www.jianshu.com/p/57c065b124c4
  • w990997566
  • w990997566
  • 2018-03-05 09:24:52
  • 29
    个人资料
    持之以恒
    等级:
    访问量: 2398
    积分: 226
    排名: 33万+
    最新评论