优化太多的if-else

来源java小当家
  • 第1种方法:提前return,减少else判断

 1  // 1.优化前
 2     private int handlerPre1(boolean flag) {
 3         if(flag){
 4             // TODO
 5             return 0;
 6         }else{
 7             // TODO
 8             return -1;
 9         }
10     }
11     // 第1种方法:提前return,减少else判断
12     // 这个做法,将可以return的状态提到if中,直接干掉else
13     private int handlerAfter1(boolean flag) {
14         if(!flag){
15             // TODO
16             return -1;
17         }
18         return 0;
19     }
  • 第2种方法:使用三目运算符

 1 // 2.优化前
 2     private int handlerPre2(boolean flag) {
 3         if(flag){
 4             return 0;
 5         }else{
 6             return -1;
 7         }
 8     }
 9     // 第2种方法:使用三目运算符
10     // 对那些依据状态直接返回某个值的情况非常适用,但如果三目运算符中还镶嵌三目运算,建议不要使用
11     private int handlerAfter2(boolean flag) {
12         return flag?0:-1;
13     }
  • 第3种方法:使用Optional

 1     // 3.优化前
 2     private Integer handlerPre3(){
 3         User user = new User();
 4         if(user != null){
 5             return user.getAge();
 6         }
 7         return null;
 8     }
 9     // 第3种方法:使用Optional
10     // Optional让非空校验更加优雅,代码层面减少了if判断。
11     private Integer handlerAfter3(){
12         User user = new User();
13         Optional<User> optional = Optional.ofNullable(user);
14         return optional.map(User::getAge).orElse(null);
15     }
  • 第4种方法:使用switch

 1 // 4.优化前
 2     private String getCnPre(String en){
 3         String cn;
 4         if("student".equals(en)){
 5             cn = "学生";
 6         }else if("teacher".equals(en)){
 7             cn = "教师";
 8         }else{
 9             cn = "未知";
10         }
11         return cn;
12     }
13 
14     // 4.1 优化后 使用switch
15     private String getCnAfter1(String en){
16         switch (en) {
17             case "student":
18                 return "学生";
19             case "teacher":
20                 return "教师";
21             default:
22                 return "未知";
23         }
24     }
  • 第5种方法:使用枚举

 1 public enum CnEnum {
 2     STUDENT("student","学生"),
 3     TEACHER("teacher","教师"),
 4     UNKNOWN("unknown","未知");
 5     private String en;
 6     private String cn;
 7 
 8     public String getEn() {
 9         return en;
10     }
11     public void setEn(String en) {
12         this.en = en;
13     }
14     public String getCn() {
15         return cn;
16     }
17     public void setCn(String cn) {
18         this.cn = cn;
19     }
20     CnEnum(String en, String cn) {
21         this.en = en;
22         this.cn = cn;
23     }
24 
25     static String of(String en){
26         for (CnEnum temp : CnEnum.values()){
27             if(temp.getEn().equals(en)){
28                 return temp.getCn();
29             }
30         }
31         return CnEnum.UNKNOWN.getCn();
32     }
33 }
1  // 4.2 优化前 使用枚举
2     private String getCnAfter2(String en){
3         return CnEnum.of(en);
4     }
  • 第6种方法:使用工厂模式

    (1)定义一个职业接口,里面定义一个输出方法

1 public interface Profession {
2     String output();// 输出
3 }

    (2)每增加一种职业,都实现这个接口(策略模式)

 1 public class Teacher implements Profession{
 2     @Override
 3     public String output() {
 4         return "教书";
 5     }
 6 }
 7 
 8 public class Student implements Profession{
 9     @Override
10     public String output() {
11         return "学习";
12     }
13 }

    (3)定义一个工厂类,用来根据具体情况生产各种职业类(工厂模式)

 1 public class ProfessionFactory {
 2 
 3     private static Map<String,Profession> map = new HashMap<>();
 4     private static final Profession DEFAULT_PROFESSION = new DefaultProfession();
 5     static {
 6         map.put("student",new Student());
 7         map.put("teacher",new Teacher());
 8         map.put("default",DEFAULT_PROFESSION);
 9     }
10     public static Profession getProfession(String en){
11         Profession profession = map.get(en);
12         return profession == null?DEFAULT_PROFESSION:profession;
13     }
14 
15     static class DefaultProfession implements Profession {
16         @Override
17         public String output() {
18             return "未知";
19         }
20     }
21 
22 }

    (4)测试

1  // 5.优化后 使用 策略模式+工厂模式
2     // 1.定义一个职业接口,里面定义一个输出方法
3     // 2.每增加一种职业,都实现这个接口(策略模式)
4     // 3.定义一个工厂类,用来根据具体情况生产各种职业类(工厂模式)
5     private void handlerAfter5(String en){
6         Profession profession = ProfessionFactory.getProfession(en);
7         System.out.println(profession.output());
8     }
原文地址:https://www.cnblogs.com/zcjyzh/p/14271661.html