if-else代码优化方案


前言

如果代码中if-else比较多,阅读起来比较头疼,后期维护难度较大,很容易改出bug,接下来,本文将介绍七种if-else代码优化的方案。

在这里插入图片描述


方案一:提前return,去除不必要的else

如果if-else代码块包含return语句,可以考虑通过提前return,把多余else干掉,使代码更加优雅。

优化前:

if(condition){
 
	//doSomething
 
}else{
 
	return ;
 
}

优化后:

if!condition){
 
	return ;
 
}

//doSomething

方案二:使用条件三元运算符

使用条件三元运算符可以简化某些if-else,使代码更加简洁,更具有可读性。

优化前:

int price ;
 
if(condition){
 
	price = 80;
 
}else{
 
	price = 100;
 
}

优化后:

int price = condition ? 80 : 100;

方案三:合并条件表达式

如果有一系列条件返回一样的结果,可以将它们合并为一个条件表达式,让逻辑更加清晰。

优化前:

double getVipDiscount() {
	 
	if(age < 18){
	 
		return 0.8;
	 
	}
	 
	if("深圳".equals(city)){
	 
		return 0.8;
	 
	}
	 
	if(isStudent){
	 
		return 0.8;
	}
	 
	//do somethig
 
}

优化后:

double getVipDiscount(){
 
	if(age < 18 || "深圳".equals(city) || isStudent){
	 
		return 0.8;
	 
	}
	 
	//doSomthing
 
}

方案四:使用 Optional

有时候if-else比较多,是因为非空判断导致的,这时候你可以使用java8的Optional进行优化。

优化前:

String str = "jay@huaxiao";
 
if (str != null) {
 
	System.out.println(str);
 
} else {
 
	System.out.println("Null");
 
}

优化后:

Optional<String> strOptional = Optional.of("jay@huaxiao");
 
strOptional.ifPresentOrElse(System.out::println, () -> System.out.println("Null"));

方案五:使用枚举

在某些时候,使用枚举也可以优化if-else逻辑分支,按个人理解,它也可以看做一种表驱动方法

优化前:

String OrderStatusDesc;
 
if(orderStatus == 0){
 
	OrderStatusDesc = "订单未支付";
 
}else if(OrderStatus == 1){
 
	OrderStatusDesc = "订单已支付";
 
}else if(OrderStatus == 2){
 
	OrderStatusDesc = "已发货";
	
}

优化后:

先定义一个枚举

@Getter
@AllArgsConstructor
public enum OrderStatusEnum {

    UN_PAID(0, "订单未支付"),
    PAIDED(1, "订单已支付"),
    SENDED(2, "已发货");

    private final int index;
    private final String desc;

    public static String getDescByIndex(int code) {
        for (OrderStatusEnum g : OrderStatusEnum.values()) {
            if (g.getIndex() == code) {
                return g.getDesc();
            }
        }
        return null;
    }

}

有了枚举之后,以上if-else逻辑分支,就可以优化为一行代码。

String OrderStatusDes = OrderStatusEnum.getDescByIndex(orderStatus);

方案六:表驱动法

表驱动法,又称之为表驱动、表驱动方法。表驱动方法是一种使你可以在表中查找信息,而不必用很多的逻辑语句(if或Case)来把它们找出来的方法。

优化前:

if (param.equals(value1)) {
 
	doAction1(someParams);
 
} else if (param.equals(value2)) {
 
	doAction2(someParams);
 
} else if (param.equals(value3)) {
 
	doAction3(someParams);
 
}

优化后:

以下的demo,使用Map结合Function函数,把Map抽象成表,在Map中查找信息,而省去不必要的逻辑语句。

Map<?, Function<?> action> actionMappings = new HashMap<>(); // 这里泛型 ? 是为方便演示,实际可替换为你需要的类型
 
 
// 初始化
 
actionMappings.put(value1, (someParams) -> { doAction1(someParams)});
 
actionMappings.put(value2, (someParams) -> { doAction2(someParams)});
 
actionMappings.put(value3, (someParams) -> { doAction3(someParams)});
 
 
// 省略多余逻辑语句
 
actionMappings.get(param).apply(someParams);

方案七:策略模式+工厂方法消除if else

假设需求为:根据不同勋章类型,处理相对应的勋章服务。

优化前:

String medalType = "guest";
 
if ("guest".equals(medalType)) {
 
	System.out.println("嘉宾勋章");
 
} else if ("vip".equals(medalType)) {
 
	System.out.println("会员勋章");
 
} else if ("guard".equals(medalType)) {
 
	System.out.println("守护勋章");
 
}

优化后:

首先,我们把每个条件逻辑代码块,抽象成一个公共的接口,可以得出以下代码:

//勋章接口
 
public interface IMedalService {
 
	void showMedal();
 
}

我们根据每个逻辑条件,定义相对应的策略实现类,可得以下代码:

//守护勋章策略实现类
public class GuardMedalServiceImpl implements IMedalService {
    @Override
    public void showMedal() {
        System.out.println("守护勋章");
    }
}
//嘉宾勋章策略实现类
public class GuestMedalServiceImpl implements IMedalService {
    @Override
    public void showMedal() {
        System.out.println("嘉宾勋章");
    }
}
//VIP勋章策略实现类
public class VipMedalServiceImpl implements IMedalService {
    @Override
    public void showMedal() {
        System.out.println("会员勋章");
    }
}

接下来,我们再定义策略工厂类,用来管理这些勋章实现策略类,如下:

//勋章服务工产类
public class MedalServicesFactory {
 
    private static final Map<String, IMedalService> map = new HashMap<>();
    static {
        map.put("guard", new GuardMedalServiceImpl());
        map.put("vip", new VipMedalServiceImpl());
        map.put("guest", new GuestMedalServiceImpl());
    }
    public static IMedalService getMedalService(String medalType) {
        return map.get(medalType);
    }
}

使用了策略+工厂模式之后,代码变得简洁多了,如下:

public class Test {
 
	public static void main(String[] args) {
	 
		String medalType = "guest";
		 
		IMedalService medalService = MedalServicesFactory.getMedalService(medalType);
		 
		medalService.showMedal();
	 
	}
 
}

参考链接:https://juejin.cn/post/6844904083665453063
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值