推荐switch-case语句使用枚举来判断

Java中switch-case语句主要用来做条件分支的判断,判断一个变量与一系列的值做相等匹配,每个值都属于一个分支.

1 switch-case简介

语法

switch(expression){
    
    
    case value :
       //语句
       break; //可选
    case value :
       //语句
       break; //可选
    //...
    default : //可选
       //语句
}

说明:

  • 1 switch语句中expression支持的类型为: byte,short,int,char,String,枚举, 但是不支持表达式 如num>0
  • 2 switch语句可以有多个case语句, 但是每个case后面要有一个比较值和冒号
  • 3 switch语句遇到break会终止语句. 每个case的语句后break为可选, 如果没有break,会造成穿透效果,即执行后续所有的case语句,直到遇到break语句.
  • 4 switch语句中可以添加一个默认分支default. 放置位置没有规定,一般放在最后.当所有分支条件都不满足时,才会走到默认分支,且此分支不需要break语句.

2 switch-case案列

public class switchDemo {
    
    
    
    public static void main(String[] args) {
    
    

        /**
         * 运行结果:
         * 优+
         * 你的等级是 A
         */
        intTest('A');

        /**
         * 运行结果:
         * 优
         * 良
         * 你的等级是 B
         */
        intTest('B');
    }

    public static void intTest(char grade) {
    
    
        switch (grade) {
    
    
            case 'A':
                System.out.println("优+");
                break;
            case 'B':
                System.out.println("优");
            case 'C':
                System.out.println("良");
                break;
            case 'D':
                System.out.println("及格");
                break;
            case 'F':
                System.out.println("不及格");
                break;
            default:
                System.out.println("未知等级");
        }
        System.out.println("你的等级是 " + grade);
    }
    
}

从控制台输出的结果可以得知, A等级表示优+. B等级为优, 因为没有break语句,造成穿透,把等级为C的语句也执行了.

使用枚举类作为条件

在使用switch中,通常建议使用枚举来替代字符串等变量的比较, 主要是方便后期维护和新增,使得代码规范性更好.

下列使用枚举方案来替代:

1 新建一个枚举类

public enum ScoreEnum {
    
    

    EXCELLENTPLUS('A', "优+"),
    EXCELLENT('B', "优"),
    GOOD('C', "良"),
    PASS('D', "及格"),
    FAIL('E', "不及格"),
    UNKNOWN('N', "未知等级");

    private Character rank;
    private String message;


    public static ScoreEnum getByRank(Character rank) {
    
    
        for (ScoreEnum scoreEnum : ScoreEnum.values()) {
    
    
            if (scoreEnum.rank.equals(rank)) {
    
    
                return scoreEnum;
            }
        }
        return UNKNOWN;
    }


    ScoreEnum(Character rank, String message) {
    
    
        this.rank = rank;
        this.message = message;
    }


    public Character getRank() {
    
    
        return rank;
    }

    public void setRank(Character rank) {
    
    
        this.rank = rank;
    }

    public String getMessage() {
    
    
        return message;
    }

    public void setMessage(String message) {
    
    
        this.message = message;
    }
}

2 替换switch比较条件

扫描二维码关注公众号,回复: 13282791 查看本文章
    public static void intEnumTest(char grade) {
    
    

        ScoreEnum scoreEnum = ScoreEnum.getByRank(grade);
        switch (scoreEnum) {
    
    
            case EXCELLENTPLUS:
                System.out.println("优+");
                System.out.println(scoreEnum.getMessage());
                break;
            case EXCELLENT:
                System.out.println("优");
                System.out.println(scoreEnum.getMessage());
            case GOOD:
                System.out.println("良");
                System.out.println(scoreEnum.getMessage());
                break;
            case PASS:
                System.out.println("及格");
                System.out.println(scoreEnum.getMessage());
                break;
            case FAIL:
                System.out.println("不及格");
                System.out.println(scoreEnum.getMessage());
                break;
            default:
                System.out.println("未知等级");
                System.out.println(scoreEnum.getMessage());
        }
        System.out.println("你的等级是 " + grade);

    }

3 比较同样的结果

    public static void main(String[] args) {
    
    
        
        /**
         * 运行结果:
         * 优+
         * 优+
         * 你的等级是 A
         *
         */
        intEnumTest('A');

        /**
         * 运行结果:
         * 优
         * 优
         * 良
         * 优
         * 你的等级是 B
         */
        intEnumTest('B');
    }

3 关于switch-case和if-else的比较

1 关于效率.当分支条件多时,switch-case效率较高. 因为在编译时switch-case会生成一个跳转表,来指向实际的case分支地址,跳转表的索引号和switch变量相等的,所以switch-case只需要通过访问对应索引号的项从而达到定位分支. 而if-else结构需要遍历所有的条件分支,直到找到符合条件的.(switch-case像用空间换时间的算法)

2 关于适用范围.switch-case仅在常量选择分支时使用,对于变量表达式,如(num>10 || num<5)等等,不能实现功能,所以相比来说,if-else的使用范围更广,适用的场景更多.

参考资料:

https://www.runoob.com/java/java-switch-case.html

猜你喜欢

转载自blog.csdn.net/ABestRookie/article/details/121150711