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

太多的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();
    }
  • 17
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
以下是几种Java中优化if-else代码的方法: 1. 使用策略枚举来优化if-else。策略枚举是一种常用的设计模式,它可以将一组算法封装起来,并使它们之间可以互换。这种方法可以避免使用大量的if-else语句,提高代码的可读性和可维护性。 2. 使用switch语句来代替if-else。在某些情况下,使用switch语句可以使代码更加简洁和易于理解。但是,如果case语句过多,也会导致代码变得冗长和难以维护。 3. 使用多态来代替if-else。多态是面向对象编程中的一个重要概念,它可以使代码更加灵活和可扩展。通过将不同的行为封装在不同的类中,可以避免使用大量的if-else语句。 4. 使用Optional类优化if-else。Optional类是Java 8中引入的一个新特性,它可以使代码更加简洁和易于理解。通过使用Optional类,可以避免使用大量的if-else语句来处理空值的情况。 以下是一个使用策略枚举来优化if-else的例子: ```java public enum Discount { VIP(0.8), NORMAL(1.0), NEW(0.9); private double discount; Discount(double discount) { this.discount = discount; } public double getDiscount() { return discount; } } public class Order { private double price; private Discount discount; public Order(double price, Discount discount) { this.price = price; this.discount = discount; } public double calculatePrice() { return price * discount.getDiscount(); } } // 使用策略枚举来计算订单价格 Order order = new Order(100, Discount.VIP); double price = order.calculatePrice(); System.out.println(price); // 输出:80.0 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值