如何优化代码中的if...else

概述

如果你要去查多层IF…ELSE有什么危害, 估计会有很多, 什么不容易扩展、可读性差。 其实所有代码优化的核心目的都是一个: 不让人看见是自己写的代码看起来很LOW。。 想象一下公司新来了一个毕业生, 要研读一下系统代码, 忽然看见有十个if else… 一打开代码记录,发现是对面的你写的, 一定心里想, 这个师兄技术一定不咋地。 所以 今天简单总结下如何优化代码中看起来很low的if…else…

第一式:能返回及时返回

if(条件1) {
   return;
} else {
  //逻辑B
}

优化为:

if(条件1) {
   return;
}
//逻辑B

这种最常见在非空判断的时候, 如果是空 或者已经有了明确的返回值的时候就及时返回, 少了一个else之后的条件

第二式:三目运算符

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

优化后:

int price = condition ? 80 :100;

看着是不是好看了? 这特么不就是if…else。

第三式:数据字典法

这个办法是核心就是把if…else用一个结构先存起来, 命中key 返回对应的value, 这个结构可以是枚举、MashMap、Java对象 甚至是数据库。 用枚举举例子:


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

优化之后


public enum OrderStatusEnum {     
    UN_PAID(0,"订单未支付"),
 
    PAIDED(1,"订单已支付"),
 
    SENDED(2,"已发货"),; 
     
    private int index;  
   
    private String desc;
      
    public int getIndex() {         
        return index;     
    } 
    
    public String getDesc() {         
        return desc;     
    } 
     
    OrderStatusEnum(int index, String desc){         
        this.index = index;         
        this.desc =desc;     
    }  
    
    OrderStatusEnum of(int orderStatus) {         
        for (OrderStatusEnum temp : OrderStatusEnum.values()) {             
            if (temp.getIndex() == orderStatus) {                 
                 return temp;             
            }         
        }         
        return null;     
    } 
}

使用:

String OrderStatusDes = OrderStatusEnum.0f(orderStatus).getDesc();

这个方法就实用多了, 确实方便扩展, 且不low, 是一种常见的方式。

第四式:Optional大法

Optional是Java8引入的, 确实挺好使的, 用的方法就是:

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

和三目表达式有异曲同工的意思。但更强大。

第五式:策略模式+工厂方法消除 if else

这个算是个比较高端的玩法, 但是并不是都适合, 一般都用在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();     
    } 
} 

是不是看起来难懂了很多? 对 这就是代码优化的目的, 这时候实习生已经对你有些敬仰了。

终极姿势: 系统架构层优化IF…ELSE

引入规则引擎, 之前写过就不重复写了, 链接:
https://blog.csdn.net/wangpengzhi19891223/article/details/87793025
https://blog.csdn.net/wangpengzhi19891223/article/details/87867579

你可能感兴趣的:(Java面试题合集,java基础)