LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

如何去掉代码中的if...else

admin
2024年6月18日 9:52 本文热度 1012

导读

作为一名在第一线搬砖的打工人,if...else几乎是最常见的代码了。下面我们一起来看一下如何干掉if...else吧,看看你掌握几种。

1. 提前 return

这种方法一般只适合分支结构很简单的if...else,我们可以提前 return,比如一些参数校验。

private void processStrings(List<String> list) {
    if (null != list) {
        doSomething();
    }
}
private void processStrings(List<String> list) {
    if (null == list) {
        return;
    }
    doSomething();
}

2. Optional 判空

private String getOrderStatus(int id) {
    Order order = getById(id);
    if (order == null) {
        return "-1";
    } else {
        return order.getStatus();
    }
}

对于这种代码可以利用 Optional 可以非常优雅地解决。

Optional类是 Java 8 中引入的一个用于处理可能为 null 的值的容器类。

return Optional.ofNullable(order).map(o -> o.getOrderStatus()).orElse("-1");

3. 枚举

private String getOrderStatusDes(String status) {
    if ("1".equals(status)) {
        status = "未支付";
    } else if ("2".equals(status)) {
        status = "已支付";
    } else if ("3".equals(status)) {
        status = "已发货";
    } else if ("4".equals(status)) {
        status = "已签收";
    } else if ("5".equals(status)) {
        status = "已评价";
    }
    return status;
}

这种类型的代码非常适合枚举来解决。先定义一个枚举类:

@Getter
@AllArgsConstructor
public enum OrderStatusEnum {
    UN_PAID("1","未支付"),
    PAID("2","已支付"),
    SEND("3","已发货"),
    SING("4","已签收"),
    EVALUATE("5","已评价");

    private String status;
    private String statusDes;
    
    public static OrderStatusEnum getDes(String status) {
        return Arrays.stream(values()).filter(o -> o.getStatus().equals(status)).findFirst().orElse(null);
    }
}

有了这个枚举,上面代码直接可以优化为一行代码:

String orderStatusDes = Optional.ofNullable(OrderStatusEnum.getDes("3")).map(e -> e.getStatusDes()).orElse("");

4. 策略模式 + 工厂方法

假设有如下代码:

if ("codeA".equals(code)) {
    doSomethingA();
else if ("codeB".equals(code)) {
    doSomethingB();
else if ("codeC".equals(code)) {
    doSomethingC();
}

可以使用使用策略模式 + 工厂方法来优化,首先创建一个处理的策略接口:

public interface HandleService {
    void doSomething();
}

具体的策略实现类:

public class HandleServiceImplA implements HandleService {
    @Override
    public void doSomething() {
        System.out.println("执行A计划...");
    }
}

public class HandleServiceImplB implements HandleService {
    @Override
    public void doSomething() {
        System.out.println("执行B计划...");
    }
}

public class HandleServiceImplC implements HandleService {
    @Override
    public void doSomething() {
        System.out.println("执行C计划...");
    }
}

工厂类,统一调度,用来管理这些策略,如下:

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class HandleServiceFactory {

    private HandleServiceFactory(){
    }

    /** 使用ConcurrentHashMap以确保线程安全 */
    private static final Map<String, HandleService> SERVICE_MAP = new ConcurrentHashMap<>();

    static {
        // 初始化存入HandleService实例
        SERVICE_MAP.put("codeA"new HandleServiceImplA());
        SERVICE_MAP.put("codeB"new HandleServiceImplB());
        SERVICE_MAP.put("codeC"new HandleServiceImplC());
    }

    private static class SingletonHolder {
        private static HandleServiceFactory instance = new HandleServiceFactory();
    }

    /**
     * 获取HandleServiceFactory的单例实例。
     * 这个方法是静态的,可以通过类名直接调用,而不需要先创建该类的实例。
     * 它确保了整个应用中只有一个HandleServiceFactory实例存在,符合单例模式的设计原则。
     *
     * @return 返回HandleServiceFactory的单例实例。
     */

    public static HandleServiceFactory getInstance(){
        return SingletonHolder.instance;
    }

    /**
     * 根据给定的编码获取对应的处理服务。
     * <p>
     * 注意:传入的code不能为空。如果传入的编码没有对应的处理服务,则抛出具体的异常。
     *
     * @param code
     * @return 返回对应代码字符串的 HandleService 实例。
     * @throws IllegalArgumentException 如果传入的编码没有对应的处理服务,则抛出此异常。
     */

    public static HandleService getHandleService(String code) throws IllegalArgumentException {
        // 首先检查code是否为null
        if (code == null) {
            throw new IllegalArgumentException("传入的code不能为空");
        }
        // 从SERVICE_MAP中根据code获取对应的HandleService实例
        HandleService handleService = SERVICE_MAP.get(code);
        if (handleService == null) {
            throw new IllegalArgumentException("没有找到对应编码为[" + code + "]的HandleService实例");
        }
        return handleService;
    }

    public void handle(String code) {
        getHandleService(code).doSomething();
    }
}

使用:

public static void main(String[] args) {
    HandleServiceFactory.getInstance().handle("codeC");
}

控制台输出如下:

执行C计划...

该文章在 2024/6/18 12:44:17 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved