如果你要去查多层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中逻辑比较多,且有共性(参数列表相同)的情况下。
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://blog.csdn.net/wangpengzhi19891223/article/details/87793025
https://blog.csdn.net/wangpengzhi19891223/article/details/87867579